2012-08-23 48 views
3

使用Python3和PyQt4的我有一個函數(運行)更新的GUI,作爲輸入一個可調用的,以提供狀態更新。PyQt的:從一個回調

class Windows(QtGui.QWidget): 
    # Creates a widget containing: 
    # - a QLineEdit (status_widget) 
    # - a button, connected to on_run_clicked 

    def on_run_clicked(self): 
     def update(text): 
      self.widget.setText(text) 

     threading.Thread(target=run, args=(update,)).start() 

這可以正常工作(即文本更新在窗口小部件中正確顯示)。然而,當我通過的QTextEdit更換QLineEdit的和使用追加方法添加文本,我得到:

的QObject ::連接:不能排隊類型的參數 'QTextCursor'

(確保「QTextCursor」使用qRegisterMetaType()。)註冊

它仍然有效,但指向的事實,我做錯了什麼,我不知道,我會繼續工作瓦特如果更多線程處於活動狀態。通常情況下,我做這類使用信號和槽的更新,但運行功能不PyQt的具體。問題是:

  1. 爲什麼它沒有QLineEdit的警告,而不是 QTextEdit?
  2. 什麼是對付這樣的情況下正確的方法是什麼?

回答

8

我不知道爲什麼一個類可以工作,另一個不可以 - 我真的不知道使用Python線程與Qt線程之間的區別......但是,我可以告訴你如果你沒有正確設置,這是非常溫馨的。也就是說,你不能(或者至少不應該)從線程修改GUI對象。再次,不確定python與Qt線程的區別。但是,從GUI修改界面的安全方式是將信號發送到窗口......我知道這樣做的最簡單方法是通過Qt線程。

class MyThread(QtCore.QThread): 
    updated = QtCore.pyqtSignal(str) 

    def run(self): 
     # do some functionality 
     for i in range(10000): 
      self.updated.emit(str(i)) 

class Windows(QtGui.QWidget): 
    def __init__(self, parent = None): 
     super(Windows, self).__init__(parent) 

     self._thread = MyThread(self) 
     self._thread.updated.connect(self.updateText) 

     # create a line edit and a button 

     self._button.clicked.connect(self._thread.start) 

    def updateText(self, text): 
     self.widget.setText(text) 
+3

[此問題](http://stackoverflow.com/q/1595649/984421)是Python vs Qt線程問題的一個很好的起點。執行摘要:在與Qt交互時總是使用Qt線程;否則,使用Python線程。 – ekhumoro

+0

啊非常酷 - 謝謝! –

+0

當你不控制運行功能但是你可以給它回調時,這是正確的方法嗎?最簡單的事情似乎是在回調函數上進行發射,對吧?此外,這篇文章http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/說你不應該繼承QThread,這是否也適用於PyQt? – Hernan