私は幾分奇妙な問題があります。私はマルチスレッドアプリケーションをコーディングしており、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の場合に呼び出されます。
シグナルシグネチャの余分な '(QString)'以外に、投稿したサンプルコードに何も問題はありません。問題を示す完全で実行可能な例を投稿してください。 – ekhumoro
@ekhumoro:私はそれをすることができたらいいと思うが、プログラムは近距離である:(QStringは完全に不要であると言っているのですが、空白のままにしておかなければならないでしょうか(つまり 'changeStatus()')? –
古いスタイルの構文を使用し、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