2016-05-25 20 views
0

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

答えて

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

関連する問題