6

Python3 と PyQt4 を使用して、状態の更新を提供する呼び出し可能オブジェクトを入力として受け取る関数 ( run ) があります。

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()

これは正常に機能します (つまり、テキストの更新がウィジェットに正しく表示されます)。ただし、QLineEditQTextEditに置き換え、 appendメソッドを使用してテキストを追加すると、次のようになります。

QObject::connect: タイプ 'QTextCursor' の引数をキューに入れることができません

(「QTextCursor」が qRegisterMetaType() を使用して登録されていることを確認してください。)

それはまだ機能しますが、私が何か間違ったことをしているという事実を指摘しており、より多くのスレッドがアクティブになったときに機能し続けるかどうかはわかりません. 通常、シグナルとスロットを使用してこの種の更新を行いますが、run関数は PyQt 固有ではありません。質問は次のとおりです。

  1. QTextEditではなく、QLineEditでは警告なしで機能するのはなぜですか?
  2. このような状況に対処する正しい方法は何ですか?
4

1 に答える 1

11

あるクラスが機能し、他のクラスが機能しない具体的な理由はわかりません。また、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)
于 2012-08-23T01:37:33.730 に答える