2016-05-25 3 views
0

Я пытаюсь запустить простую аппликацию 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

ответ

0

Я нашел ответ в другой теме:

StackOverflow: Pyside setText() not updating QLabel

В этом случае виджет не перекрасили и, следовательно, она необходима, чтобы заставить приложение перекрасить его. Я использовал этот код (см PySide Docs: QApplication):

def updateAllWidgets(): 
    for widget in QApplication.allWidgets(): 
     widget.update() 

Эта функция может быть вызвана, например, с помощью таймера:

timer = QtCore.QTimer() 
timer.start(1000) 
timer.timeout.connect(updateAllWidgets) 

Смотри также: PySide: Calling a Python function from QML and vice versa

Смежные вопросы