使用 PyQt 从一个 QML 页面移动到另一个页面
Posted
技术标签:
【中文标题】使用 PyQt 从一个 QML 页面移动到另一个页面【英文标题】:To move from one QML page to another using PyQt 【发布时间】:2017-04-04 06:18:39 【问题描述】:事实上,我是 QML 和 PyQt 的初学者,我发现过去使用 PyQt 从一个 QML 页面到另一个页面的问题,然后我们使用 QObject(属性和 setproperty)。
所以我能够显示第二个 QML 页面,然后当我使用 setproperty 时,我会收到这个错误:AttributeError: 'NoneType' has no attribute setProperty
。
我的第二页 qml "Classe.qml"
包含一个文本字段,我想要做的是,当我点击我的第一页的按钮 "main.qml"
会出现第二页然后文本字段更改,我们写"hello world"
.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Classe
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSlot, QVariant
# Classe servant dans l'interaction.
class MainApp(QObject):
def __init__(self, context, parent=None):
super(MainApp, self).__init__()
self.win = parent
self.win.findChild(QObject, "ObjClasse").clicked.connect(self.test3)
self.ctx = context
def test3(self):
engine.load('Classe.qml')
self.win.findChild(QObject, "labelCo").setProperty("text", "hello world") ##l'erreur est ici
if __name__ == "__main__":
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
ctx = engine.rootContext()
engine.load('main.qml')
win = engine.rootObjects()[0]
py_mainapp = MainApp(ctx,win)
ctx.setContextProperty("py_MainApp", py_mainapp)
win.show()
sys.exit(app.exec())
【问题讨论】:
不要试图将 qml 文件视为页面。他们是班级。使一个主 qml 文件使用来自其他文件的类,例如StackView
、states 或 Loaders
。另外,不要尝试从 python 调用findChild
和setProperty
。 qml 应该将 python 代码用作类库:qml 可以创建您在 python 中实现的类的对象。
很好,已经解决了,感谢您的帮助:实际上在列表rootObject中添加第二行就足够了。 def test3(self): engine.load('Classe.qml') win1 = engine.rootObjects()[1] win1.findChild(QObject, "labelCo").setProperty("text", "HELLO WORLD")跨度>
【参考方案1】:
很好,已经解决了,感谢您的帮助: 事实上,在列表 rootObject 中添加第二行就足够了。
def test3(self):
engine.load('Classe.qml')
win1 = engine.rootObjects()[1]
win1.findChild(QObject, "labelCo").setProperty("text", "HELLOWORLD")
【讨论】:
以上是关于使用 PyQt 从一个 QML 页面移动到另一个页面的主要内容,如果未能解决你的问题,请参考以下文章
Pyqt5 & QML2 部署在 debian/mint (dev - ubuntu)
使用 PyQt 将项目动态设置为 QML ListModel
我收到错误:在名称范围内找不到名称 - 在MVVMLight应用程序中从一个页面移动到另一个页面时