Я пытаюсь запустить простую аппликацию PySide с дизайном, выполненным в QML. Я хотел бы вызвать функцию в QML из Python в отдельном потоке.Свойства 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 ")
и здесь вид собран:
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_())
Если функция QML updateData(text)
вызывается из QThread, то dateStr.text
не установлен, но сообщение консоли производится. Если функция QML вызывается из основной функции, обновление dateStr.text
работает нормально.
Вопрос
Как правильный способ вызова функции QML из QtThread?
Ссылки
PySide tutorial: Connecting signals from Python to QML