2016-05-31 5 views
0

qlabelを更新するためにAJAXのような呼び出しを実行するイベントリスナーを設定できるはずですが、これはQTで無限に複雑に思えます。whileループでQLabelを更新するには

基本的には、QLabelのテキストを更新することを試みています。これは、ボタンがクリックされたときに壊れる無限ループ(フラグを含むスロットのようなもの)で発生します。この理由は、私が本質的に、ユーザーが更新したテキストファイルを読み込んでいることです。ユーザーがテキストファイルを保存すると、コンテンツはQLabelに更新されます。ユーザーがテキストに満足したとき、彼らは「送信」します。その後、リスナを殺し、テキストコンテンツを事前定義されたEメールアドレスにEメールする。これは仕事に関連しているので、ユーザーストーリーはかなり変更されていますが、全体的なコンセプトは私が進めているものです。

私は、次の手順を実行して、フラグと、このリスニングの設定のようなものをやってみました:

while not self.flag_set: 
     self.my_text = text_read_module.get_text(self) 
     self.label_60.setText(self.my_text) 
     QCoreApplication.processEvents() 
     sleep(2) 

私もそれ自身のプロセスにこれを押して終了信号を含むボタンが

呼び出されたときに終了してみました

どちらも画面上にコンテンツを表示することはできませんが、便利なダンディープリントステートメントのおかげで、実行中だと言えます。

PSこれはPythonで行われましたが、C++ユーザーにとっては簡単です。

これを取得するにはどのような考えですか?ありがとう!

+0

メインイベントループで 'processEvents'を呼び出すための使用例はほとんどなく、メインスレッドから' sleep'を呼び出すことは一般的には悪い考えです。設定が必要なテキストを常に確認する代わりに、信号/スロットの組み合わせを使用します。 –

+0

私は通常、睡眠の支持者ではありません。私はそれをストップギャップとして使用していたので、1秒100回以上は実行していません。私は間違いなく信号/スロットのコンボを使用することを好むでしょう、このユーザの話で私はどのようにしますか? –

+0

'text_read_module'がシグナルを送出できませんか? Qt以外のライブラリの一部ですか? –

答えて

4

Qt/PyQtでは、コールバックをトリガーする方法はシグナル/スロットシステムです。一般的に、何らかの操作を継続して実行する必要があり、その操作に基づいてGUIを時折更新する場合は、Signalsを使用してメインスレッドに更新を返すワーカースレッドを作成します。たとえば、ファイルの更新を継続的にチェックするワーカースレッドを作成し、変更を検出したときに信号を使用してメインスレッドにデータを返すことができます。あなたのメインスレッドのGUIは、その信号を聞いて、それに応じてGUIを更新します。

QtにはすでにQFileSystemWatcherという名前のクラスがありますので、シグナルを持つ別のスレッドを手動で作成する必要はありません。

class MyWidget(QtGui.QWidget): 

    def __init__(self): 
     super(MyWidget, self).__init__() 
     self.label = QtGui.QLabel(self) 
     self.watcher = QtCore.QFileSystemWatcher(self) 
     self.watcher.addPath('/path/to/file') 
     self.watcher.fileChanged.connect(self.updateLabel) 

    def updateLabel(self, path): 
     with open(path, 'r') as f: 
      self.label.setText(f.read()) 
+0

ありがとう、これは私が行っていたものです! –

関連する問題