2011-10-27 19 views
1

私は幾分奇妙な問題があります。私はマルチスレッドアプリケーションをコーディングしており、QThreadのデータをGUIクラスのデータに伝達するためにSIGNALSを使用しています。さらに騒がすことなく、簡略化したコードがあります。SIGNAL emitはある関数でのみ動作しますが、他の関数では動作しません。

class GUI(uiMainWindow.MainWindow): 
    def __init__(self, parent=None): 
     super etc 
     self.thread = Thread() 
     self.connect(self.thread, SIGNAL("changeStatus(QString)"), self.setStatus, Qt.QueuedConnection) 

    def setStatus(self, status): 
     self.statusBar.setText(status) 


class Thread(QThread): 
    def __init__(self, parent=None, create=True): 
     super etc 
     self.create = create 

    def run(self): 
     if self.create: 
      create_data() 
     if not self.create: 
      upload_data() 

    def create_data(self): 
     self.emit(SIGNAL("changeStatus(QString)"), "Changing the statusbar text") 
     #rest of the code 

    def upload_data(self): 
     self.emit(SIGNAL("changeStatus(QString)"), "Changing the statusbar text") 

かなり基本的ですが、しかし、ここに問題があります:self.emitはcreate_data関数でのみ動作しますが、upload_dataでは動作しません(または他の関数でも; __init__に入れてみました)。私はprint "I got the status" + statusをsetStatus関数に入れてみました。ここでも、create_data()関数では動作しますが、upload_data()関数では機能しません。

2つの関数の違いは比較的小さく、私が知る限り、self.emit関数を妨げるものは何もありません.-実際、どちらの場合も、self.emitは4-5行だけ離れています"を関数定義から削除します。

これは本当に困惑しています。どんな助け?前もって感謝します!

EDIT:もう一度、私が知る限り、2つの関数の唯一の違いはrun()です。最初のパラメータはcreateパラメータがTrueの場合に呼び出され、2つ目のパラメータはFalseの場合に呼び出されます。

+0

シグナルシグネチャの余分な '(QString)'以外に、投稿したサンプルコードに何も問題はありません。問題を示す完全で実行可能な例を投稿してください。 – ekhumoro

+0

@ekhumoro:私はそれをすることができたらいいと思うが、プログラムは近距離である:(QStringは完全に不要であると言っているのですが、空白のままにしておかなければならないでしょうか(つまり 'changeStatus()')? –

+0

古いスタイルの構文を使用し、Python呼び出し可能ファイルにPython信号を接続すると、名前(例えば 'changeState')だけが必要です。[here](http://www.riverbankcomputing.com/static/Docs/PyQt4 /html/old_style_signals_slots.html#connecting-signals-and-slots)さまざまな可能性についてはもちろんですが、もちろん新しいプロジェクトでは、[新しいスタイルの構文](http://www.riverbankcomputing.com/ – ekhumoro

答えて

1

私は自分のポストにいました。 Thread()とThread(create = False)の違いは非常に重要でした。私は新しい方法(1つはself.thread = Thread()ともう1つはself.diff_thread = Thread(create=False))を定義し、それを動作させるために別のスロットに接続しなければなりませんでした。

関連する問題