0
点赞
收藏
分享

微信扫一扫

PySide6:Python QML集成

本教程提供了一个加载并与QML文件交互python应用程序的快速浏览。QML是一种声明性语言,它允许您比传统语言(如C++)更快地设计UI。QtQml和QtQuick模块为基于QML的UI提供了必要的基础设施。

在本教程中,您将学习如何将Python与QML应用程序集成。该机制将帮助我们理解如何使用Python作为QML接口中UI元素的某些信号的后端。此外,您将学习如何使用Qt Quick Controls 2中的一个功能为QML应用程序提供现代外观。

本教程基于一个应用程序,该应用程序允许您设置许多文本属性,如增加字体大小、更改颜色、更改样式等。在开始之前,请安装PySide6 Python包。

以下分步过程将指导您完成基于QML的应用程序和PySide6集成的关键元素:

  1. 首先,让我们从以下基于QML的UI开始:

PySide6:Python QML集成_python

该设计基于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的引用。

  1. 现在,返回QML文件,将信号连接到Bridge类中定义的插槽:

Bridge {
id: 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,这就是我们确保只有一个应用于文本的方式。

  1. 每个插槽验证所选选项是否包含与属性关联的文本:

    @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:

  1. 现在,要更改应用程序的外观,您有两个选项:
  • 使用命令行:执行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

您可以在​​此处​​阅读有关此配置文件的更多信息。

应用程序的最终外观将是:

PySide6:Python QML集成_ide_02

您可以在view.qml和main.py尝试此示例。

举报

相关推荐

0 条评论