本教程提供了一个加载并与QML文件交互python应用程序的快速浏览。QML是一种声明性语言,它允许您比传统语言(如C++)更快地设计UI。QtQml和QtQuick模块为基于QML的UI提供了必要的基础设施。
在本教程中,您将学习如何将Python与QML应用程序集成。该机制将帮助我们理解如何使用Python作为QML接口中UI元素的某些信号的后端。此外,您将学习如何使用Qt Quick Controls 2中的一个功能为QML应用程序提供现代外观。
本教程基于一个应用程序,该应用程序允许您设置许多文本属性,如增加字体大小、更改颜色、更改样式等。在开始之前,请安装PySide6 Python包。
以下分步过程将指导您完成基于QML的应用程序和PySide6集成的关键元素:
- 首先,让我们从以下基于QML的UI开始:
该设计基于GridLayout,包含两个ColumnLayout。在UI中,您会发现许多RadioButton、Button和Slider。
2. 有了QML文件,您可以从Python加载它:
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
QQuickStyle.setStyle("Material")
engine = QQmlApplicationEngine()
# Get the path of the current directory, and then add the name
# of the QML file, to load it.
qml_file = Path(__file__).parent / 'view.qml'
engine.load(qml_file)
if not engine.rootObjects():
sys.exit(-1)
注意,我们只需要一个QQmlApplicationEngine来加载QML文件。
3. 定义Bridge类,包含将在QML中注册的元素的所有逻辑:
# To be used on the @QmlElement decorator
# (QML_IMPORT_MINOR_VERSION is optional)
QML_IMPORT_NAME = "io.qt.textproperties"
QML_IMPORT_MAJOR_VERSION = 1
@QmlElement
class Bridge(QObject):
@Slot(str, result=str)
def getColor(self, s):
if s.lower() == "red":
return "#ef9a9a"
elif s.lower() == "green":
return "#a5d6a7"
elif s.lower() == "blue":
return "#90caf9"
else:
return "white"
@Slot(float, result=int)
def getSize(self, s):
size = int(s * 34)
if size <= 0:
return 1
else:
return size
@Slot(str, result=bool)
def getItalic(self, s):
if s.lower() == "italic":
return True
else:
return False
@Slot(str, result=bool)
def getBold(self, s):
if s.lower() == "bold":
return True
else:
return False
请注意,由于QmlElement修饰符,注册发生了,它在下面使用了对Bridge类和变量QML_IMPORT_NAME和QML_IMPORT _MAJOR_VERSION的引用。
- 现在,返回QML文件,将信号连接到Bridge类中定义的插槽:
在ApplicationWindow中,我们声明一个与Python类同名的组件,并提供一个id:。这个id将帮助您获取从Python注册的元素的引用。
RadioButton {
id: italic
Layout.alignment: Qt.AlignLeft
text: "Italic"
onToggled: {
leftlabel.font.italic = bridge.getItalic(italic.text)
leftlabel.font.bold = bridge.getBold(italic.text)
leftlabel.font.underline = bridge.getUnderline(italic.text)
}
}
斜体、粗体和下划线属性是互斥的,这意味着任何时候只能有一个属性处于活动状态。为了实现这一点,每次选择其中一个选项时,我们都会通过QML元素属性检查这三个属性,正如您在上面的代码片段中看到的那样。三个选项中只有一个将返回True,而其他两个将返回False,这就是我们确保只有一个应用于文本的方式。
- 每个插槽验证所选选项是否包含与属性关联的文本:
@Slot(str, result=bool)
def getItalic(self, s):
if s.lower() == "italic":
return True
else:
return False
返回True或False允许您激活和停用QML UI元素的属性。
也可以返回其他非布尔值,如负责返回字体大小的槽:
@Slot(float, result=int)
def getSize(self, s):
size = int(s * 34)
if size <= 0:
return 1
else:
- 现在,要更改应用程序的外观,您有两个选项:
- 使用命令行:执行python文件,添加选项–style:
python main.py --style material
- 使用qtquickcontrols2.conf文件:
[Controls]
Style=Material
[Universal]
Theme=System
Accent=Red
[Material]
Theme=Dark
Accent=Red
然后加这个文件到你的.qrc文件:
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/">
<file>qtquickcontrols2.conf</file>
</qresource>
</RCC>
生成运行的rc文件,pyside6-rcc style.qrc > style_rc.py, 最后从你的main.py文件导入它.
import sys
from pathlib import Path
from PySide6.QtCore import QObject, Slot
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine, QmlElement
from PySide6.QtQuickControls2 import QQuickStyle
import style_rc
您可以在此处阅读有关此配置文件的更多信息。
应用程序的最终外观将是:
您可以在view.qml和main.py尝试此示例。