PyQt のメイン ウィンドウとスレッド間のデータの共有
マルチスレッド アプリケーションでは、多くの場合、メイン ウィンドウのスレッドとワーカー スレッドの間でデータを共有する必要があります。スレッドの安全性と適切な通信を確保するために、PyQt はいくつかの実用的なアプローチを提供します。
オプション 1: メイン ウィンドウへの直接参照
このアプローチでは、メイン ウィンドウへの参照が必要になります。ウィンドウがスレッドに渡されます。その後、スレッドはスピンボックスの値など、メイン ウィンドウ内のデータに直接アクセスできるようになります。
class MainWindow(QtGui.QWidget):
def __init__(self):
# ...
self.worker = Worker(self)
# ...
class Worker(QtCore.QThread):
def __init__(self, host_window):
super(Worker, self).__init__()
self.host = host_window
# ...
オプション 2: シグナルとスロット
PyQt はオブジェクト間の通信にシグナルとスロットを使用します。このアプローチでは、データが変更されたときにワーカー スレッドがシグナルを発行し、メイン ウィンドウ スロット関数が更新を処理します。
class MainWindow(QtGui.QWidget):
def __init__(self):
# ...
self.worker = Worker()
self.worker.beep.connect(self.update)
# ...
class Worker(QtCore.QThread):
beep = QtCore.pyqtSignal(int)
def __init__(self):
super(Worker, self).__init__()
# ...
どのオプションを使用しますか?
選択は、スレッドのニーズと必要な制御レベルによって異なります。
スレッドの安全性に関する考慮事項
ウィジェットはスレッドセーフではありません。したがって、シグナルとスロットを使用してスレッドとメイン ウィンドウ間の通信を処理することが重要です。複数のスレッドからウィジェットを直接操作すると、予期しない動作が発生する可能性があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3