Unsolved Python (PyQt5) and signals
-
I'm trying to get signals working from Python and need some help.
I have one main QML file (main.qml) with an application window and then am loading a second QML file with a pane via StackView
main.qml
import QtQuick 2.2 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.0 import QtQuick.Controls.Material 2.0 ApplicationWindow{ id: window width: 800 height: 480 visible: true title: "Demo" StackView { id: stackView anchors.fill: parent initialItem: Qt.resolvedUrl("pages/Page1.qml") } }
page1.qml
import QtQuick 2.6 import QtQuick.Extras 1.4 import QtQuick.Controls.Styles 1.4 import QtQuick.Controls 2.0 Pane{ id: pane1 width: 800 height: 480 property var testString: "Test works" function test(t) { testString = t } Text { id: testText x: 11 y: 62 text: testString font.pixelSize: 150 } }
import os import sys import threading from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtQml import * from PyQt5.QtWidgets import * from PyQt5.QtQuick import * class Test(QObject): done = pyqtSignal(int) _running = False def __init__(self): QObject.__init__(self) self._running = False print('__init__') def _Test(self): print('_Test') self._running = False self.done.emit('Test worked') @pyqtSlot() def doTest(self): if not self.running: print('doTest') self._running = True thread = threading.Thread(target=self._Test) thread.start() def main(): app = QGuiApplication(sys.argv) engine = QQmlApplicationEngine() test = Test() engine.rootContext().setContextProperty('test', test) engine.load(QUrl("main.qml")) root = engine.rootObjects()[0] test.done.connect(root.test) app.exec() if __name__ == "__main__": main()
The error I get is:
init
Traceback (most recent call last):
File "main.py", line 48, in <module>
main()
File "main.py", line 44, in main
test.done.connect(root.test)
AttributeError: 'QQuickWindow' object has no attribute 'test'I understand why, but I don't know how to correct it. How do I get the test function so I can connect to it when it's in a child of mail.qml?