栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何通过PySide2连接Python和QML?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何通过PySide2连接Python和QML?

您的问题涉及很多方面,因此我将尝试在其答案中进行详细说明,并且此答案将不断更新,因为此类问题经常被问到,但它们是针对特定情况的解决方案,因此,我将自由给出一种通用方法,并在可能的情况下具体说明。

QML到Python:

您的方法之所以有效,是因为python中的类型转换是动态的,而在C
++中则不会发生。它适用于小型任务,但不可维护,逻辑必须与视图分离,因此不应依赖于逻辑。具体来说,假设打印的文本将由逻辑执行一些处理,然后,如果您修改信号的名称,或者如果数据不依赖

ApplicationWindow
于另一个元素,等等,那么您将拥有更改很多连接代码。

所建议的建议是创建一个类,该类负责映射所需逻辑的数据并将其嵌入

QML
,因此,如果在视图中进行了某些更改,则只需更改连接即可:

例:

main.py

import sysfrom PySide2.QtCore import QObject, Signal, Property, QUrlfrom PySide2.QtGui import QGuiApplicationfrom PySide2.QtQml import QQmlApplicationEngineclass Backend(QObject):    textChanged = Signal(str)    def __init__(self, parent=None):        QObject.__init__(self, parent)        self.m_text = ""    @Property(str, notify=textChanged)    def text(self):        return self.m_text    @text.setter    def setText(self, text):        if self.m_text == text: return        self.m_text = text        self.textChanged.emit(self.m_text)if __name__ == '__main__':    app = QGuiApplication(sys.argv)    backend = Backend()    backend.textChanged.connect(lambda text: print(text))    engine = QQmlApplicationEngine()    engine.rootContext().setContextProperty("backend", backend)    engine.load(QUrl.fromLocalFile('main.qml'))    if not engine.rootObjects():        sys.exit(-1)    sys.exit(app.exec_())

main.qml

import QtQuick 2.10import QtQuick.Controls 2.1import QtQuick.Window 2.2ApplicationWindow {    title: qsTr("Test")    width: 640    height: 480    visible: true    Column{        TextField{ id: tf text: "Hello"        }        Button { text: qsTr("Click Me") onClicked: backend.text = tf.text        }     }}

现在,如果您希望文本由其他元素提供,则只需更改以下行:

onClicked: backend.text = tf.text


从Python到QML:

  1. 我无法告诉您此方法的错误之处,因为您没有显示任何代码,但我确实指出了缺点。主要缺点是要使用此方法,您必须有权使用该方法,并且存在两种可能性,第一种是它是您的第一个示例中所示的rootObjects或在objectName中进行搜索,但是这种情况会发生最初是寻找对象的,然后获取它,并将其从QML中删除,例如,每次更改页面时都会创建并删除StackView的页面,因此此方法将不正确。

  2. 对我来说第二种方法是正确的方法,但是您没有正确使用它,这与QtWidgets专注于使用角色的QML中的行和列不同。首先,让我们正确地实现您的代码。

首先

textlines
无法访问,
QML
因为它不是
qproperty
。就像我说过的那样,您必须通过角色进行访问,要查看模型的角色,可以打印以下结果
roleNames()

model = QStringListModel()model.setStringList(["hi", "ho"])print(model.roleNames())

输出:

{    0: PySide2.QtCore.QByteArray('display'),    1: PySide2.QtCore.QByteArray('decoration'),    2: PySide2.QtCore.QByteArray('edit'),    3: PySide2.QtCore.QByteArray('toolTip'),    4: PySide2.QtCore.QByteArray('statusTip'),    5: PySide2.QtCore.QByteArray('whatsThis')}

如果要获取文本,则必须使用role

Qt::DisplayRole
,根据docs,其数值为:

Qt::DisplayRole 0   The key data to be rendered in the form of text. (QString)

因此,

QML
您应该使用
model.display
(或仅
display
)。因此正确的代码如下:

main.py

import sysfrom PySide2.QtCore import QUrl, QStringListModelfrom PySide2.QtGui import QGuiApplicationfrom PySide2.QtQml import QQmlApplicationEngineif __name__ == '__main__':    app = QGuiApplication(sys.argv)    model = QStringListModel()    model.setStringList(["hi", "ho"])    engine = QQmlApplicationEngine()    engine.rootContext().setContextProperty("myModel", model)    engine.load(QUrl.fromLocalFile('main.qml'))    if not engine.rootObjects():        sys.exit(-1)    sys.exit(app.exec_())

main.qml

import QtQuick 2.10import QtQuick.Controls 2.1import QtQuick.Window 2.2ApplicationWindow {    title: qsTr("Test")    width: 640    height: 480    visible: true    ListView{        model: myModel        anchors.fill: parent        delegate: Text { text: model.display }    }}

如果要使其可编辑,则必须使用

model.display = foo

import QtQuick 2.10import QtQuick.Controls 2.1import QtQuick.Window 2.2ApplicationWindow {    title: qsTr("Test")    width: 640    height: 480    visible: true    ListView{        model: myModel        anchors.fill: parent        delegate:         Column{ Text{      text: model.display  } TextField{     onTextChanged: {         model.display = text     } }        }    }}

还有许多其他方法可以通过QML与Python / C 进行交互,但是最好的方法包括通过嵌入在Python / C
中创建的对象

setContextProperty

正如您所指出的,PySide2的文档并不多,它正在实现中,您可以通过以下链接查看。目前最多的是PyQt5的许多示例,所以我建议您了解两者之间的等效之处并进行翻译,因为它们是很小的更改,所以翻译不难。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/611248.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号