QML 应用教程¶
本教程提供了一个快速入门,介绍了一个加载QML文件的Python应用程序。QML是一种声明性语言,它让你比传统语言(如C++)更快地设计用户界面。QtQml和QtQuick模块为基于QML的用户界面提供了必要的基础设施。
在本教程中,您还将学习如何从Python提供数据作为QML初始属性,然后由QML文件中定义的ListView使用。
在开始之前,请安装以下先决条件:
PySide6 Python 包。
Qt Creator 来自 https://download.qt.io。
以下逐步指导将引导您完成使用Qt Creator的应用程序开发过程:
打开 Qt Creator 并选择 文件 > 新建文件或项目.. 菜单项 以打开以下对话框:
从应用程序模板列表中选择Qt for Python - Empty,然后选择Choose。
给你的项目起一个名称,选择它在文件系统中的位置,然后选择完成以创建一个空的
main.py
和main.pyproject
。这应该会为项目创建一个
main.py
和`main.pyproject
文件。下载
Main.qml
,qmldir
和logo.png
并将它们放在项目文件夹中名为 App 的子目录中。这将创建一个基本的 QML 模块。双击
main.pyproject
以在编辑模式下打开它,并将view.qml
和logo.png
添加到文件列表中。更改后,您的项目文件应如下所示:{ "files": ["main.py", "App/Main.qml", "App/logo.png", "App/qmldir"] }
现在你已经有了应用程序所需的必要部分,在你的
main.py
中导入Python模块,并下载国家数据并格式化它:1import sys 2import urllib.request 3import json 4 5from PySide6.QtQuick import QQuickView 6from PySide6.QtCore import QStringListModel 7from PySide6.QtGui import QGuiApplication 8 9 10if __name__ == '__main__': 11 12 # 获取我们的数据 13 url = "http://country.io/names.json" 14 response = urllib.request.urlopen(url) 15 data = json.loads(response.read().decode('utf-8')) 16 17 # 格式化并排序数据 18 data_list = list(data.values()) 19 data_list.sort()
现在,使用PySide6.QtGui.QGuiApplication设置应用程序窗口,它管理应用程序范围的设置。
1import sys 2import urllib.request 3import json 4 5from PySide6.QtQuick import QQuickView 6from PySide6.QtCore import QStringListModel 7from PySide6.QtGui import QGuiApplication 8 9 10if __name__ == '__main__': 11 12 # 获取我们的数据 13 url = "http://country.io/names.json" 14 response = urllib.request.urlopen(url) 15 data = json.loads(response.read().decode('utf-8')) 16 17 # 格式化并排序数据 18 data_list = list(data.values()) 19 data_list.sort() 20 21 # 设置应用程序窗口 22 app = QGuiApplication(sys.argv) 23 view = QQuickView() 24 view.setResizeMode(QQuickView.SizeRootObjectToView)
注意
如果您希望根项目调整自身大小以适应窗口,或者反之亦然,设置调整大小策略非常重要。否则,根项目将在调整窗口大小时保留其原始大小。
你现在可以将
data_list
变量暴露为 QML 初始属性,它将被view.qml
中的 QML ListView 项使用。1import sys 2import urllib.request 3import json 4 5from PySide6.QtQuick import QQuickView 6from PySide6.QtCore import QStringListModel 7from PySide6.QtGui import QGuiApplication 8 9 10if __name__ == '__main__': 11 12 # 获取我们的数据 13 url = "http://country.io/names.json" 14 response = urllib.request.urlopen(url) 15 data = json.loads(response.read().decode('utf-8')) 16 17 # 格式化并排序数据 18 data_list = list(data.values()) 19 data_list.sort() 20 21 # 设置应用程序窗口 22 app = QGuiApplication(sys.argv) 23 view = QQuickView() 24 view.setResizeMode(QQuickView.SizeRootObjectToView) 25 26 # 将列表暴露给 Qml 代码 27 my_model = QStringListModel() 28 my_model.setStringList(data_list) 29 view.setInitialProperties({"myModel": my_model})
Load the
Main.qml
to theQQuickView
and callshow()
to display the application window.1import sys 2import urllib.request 3import json 4 5from PySide6.QtQuick import QQuickView 6from PySide6.QtCore import QStringListModel 7from PySide6.QtGui import QGuiApplication 8 9 10if __name__ == '__main__': 11 12 # get our data 13 url = "http://country.io/names.json" 14 response = urllib.request.urlopen(url) 15 data = json.loads(response.read().decode('utf-8')) 16 17 # Format and sort the data 18 data_list = list(data.values()) 19 data_list.sort() 20 21 # Set up the application window 22 app = QGuiApplication(sys.argv) 23 view = QQuickView() 24 view.setResizeMode(QQuickView.SizeRootObjectToView) 25 26 # Expose the list to the Qml code 27 my_model = QStringListModel() 28 my_model.setStringList(data_list) 29 view.setInitialProperties({"myModel": my_model}) 30 31 # Load the QML file 32 # Add the current directory to the import paths and load the main module. 33 view.engine().addImportPath(sys.path[0]) 34 view.loadFromModule("App", "Main") 35 36 # Show the window 37 if view.status() == QQuickView.Error: 38 sys.exit(-1) 39 view.show()
Finally, execute the application to start the event loop and clean up.
1import sys 2import urllib.request 3import json 4 5from PySide6.QtQuick import QQuickView 6from PySide6.QtCore import QStringListModel 7from PySide6.QtGui import QGuiApplication 8 9 10if __name__ == '__main__': 11 12 # get our data 13 url = "http://country.io/names.json" 14 response = urllib.request.urlopen(url) 15 data = json.loads(response.read().decode('utf-8')) 16 17 # Format and sort the data 18 data_list = list(data.values()) 19 data_list.sort() 20 21 # Set up the application window 22 app = QGuiApplication(sys.argv) 23 view = QQuickView() 24 view.setResizeMode(QQuickView.SizeRootObjectToView) 25 26 # Expose the list to the Qml code 27 my_model = QStringListModel() 28 my_model.setStringList(data_list) 29 view.setInitialProperties({"myModel": my_model}) 30 31 # Load the QML file 32 # Add the current directory to the import paths and load the main module. 33 view.engine().addImportPath(sys.path[0]) 34 view.loadFromModule("App", "Main") 35 36 # Show the window 37 if view.status() == QQuickView.Error: 38 sys.exit(-1) 39 view.show() 40 41 # execute and cleanup 42 app.exec() 43 del view
您的应用程序现在可以运行了。选择项目模式来选择运行它的Python版本。
使用CTRL+R
键盘快捷键运行应用程序,看看它是否看起来像这样:

你也可以观看以下视频教程来获取开发此应用程序的指导: