QMLで作成した単純なPySideアプリケーションを実行しようとしています。私はPythonから別のスレッドでQMLの関数を呼びたいと思います。PySideとQtのプロパティ:PythonからQMLへの信号の接続
私は、次のしているQMLビュー:ここ
import Qt 4.7
Rectangle {
visible: true
width: 100; height: 100
color: "lightgrey"
Text {
id: dateStr
objectName: "dateStr"
x: 10
y: 10
text: "Init text"
font.pixelSize: 12
function updateData(text) {
dateStr.text = qsTr(text)
console.log("You said: " + text)
}
}
}
は私のアプリケーションです:
一部輸入....
#!/usr/bin/python
import sys
import time
from PySide import QtDeclarative, QtCore
from PySide.QtGui import QApplication
from PySide.QtDeclarative import QDeclarativeView
QThreadワーカー....
#Worker thread
class Worker(QtCore.QThread):
updateProgress = QtCore.Signal(int)
def __init__(self, child):
QtCore.QThread.__init__(self)
self.child = child
def run(self):
while True:
time.sleep(5)
#Call the function updateData - DOES NOT WORK
self.child.updateData("Other string ")
、ここでは組立図である。QML機能updateData(text)
がQthreadから呼び出された場合
if __name__ == '__main__':
# Create the Qt Application
app = QApplication(sys.argv)
# Create the view
view = QDeclarativeView()
# Connect it with QML
view.setSource(QtCore.QUrl.fromLocalFile('main_ui.qml'))
# Show UI
view.show()
#Get the root object and find the child dateStr
root = view.rootObject()
child = root.findChild(QtCore.QObject, "dateStr")
#Call the function updateData - THIS WORKS
child.updateData("String")
worker = Worker(child)
worker.start()
sys.exit(app.exec_())
、dateStr.text
が設定されていないが、コンソールメッセージが生成されます。メイン関数内からQML関数を呼び出すと、dateStr.text
の更新が正常に動作します。
質問
どうQtThreadからQMLの機能を呼び出すための適切な方法はありますか?
リンク
PySide tutorial: Connecting signals from Python to QML