PyQt5でのサブウィンドウへのデータの伝達方法は何ですか?

PyQt5を使用すると、サブウィンドウ間でデータを送信するために、シグナルとスロットの仕組みを使用することができます。具体的な手順は次のようになります:

  1. データを伝達するためのシグナルクラスを定義します。サブウィンドウクラスにシグナルオブジェクトを追加します。例えば、dataChanged = QtCore.pyqtSignal(str)
  2. 子ウィンドウでデータを渡す必要がある場合、シグナルオブジェクトを使用してシグナルを発信します。例えば:self.dataChanged.emit(data)。
  3. 子ウィンドウの信号とメインウィンドウのスロットを接続します。子ウィンドウオブジェクトが作成された後、connect()メソッドを使用して子ウィンドウの信号をメインウィンドウのスロット関数に接続します。例:subwindow.dataChanged.connect(self.handleDataChanged)。
  4. 主なウィンドウ内でスロット関数を定義し、子ウィンドウからデータを受け取るために使用します。例:def handleDataChanged(self, data):

子ウィンドウがシグナルを発信すると、親ウィンドウのスロット関数が呼び出され、そのスロット関数内でデータを取得して処理することができます。

例のコードの完全なサンプルは以下の通りです:

from PyQt5 import QtCore, QtGui, QtWidgets

class SubWindow(QtWidgets.QMainWindow):
    dataChanged = QtCore.pyqtSignal(str)
    
    def __init__(self):
        super().__init__()
        self.button = QtWidgets.QPushButton("传递数据", self)
        self.button.clicked.connect(self.sendData)
        
    def sendData(self):
        data = "Hello World"
        self.dataChanged.emit(data)
        

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.subwindow = SubWindow()
        self.subwindow.dataChanged.connect(self.handleDataChanged)
        
    def handleDataChanged(self, data):
        print(data)
        

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

この例では、サブウィンドウ内のボタンがクリックされると、”Hello World”という文字列を伝えるdataChangedシグナルが送信されます。メインウィンドウ内のスロット関数handleDataChangedはこのシグナルを受け取り、送信されたデータを印刷します。

bannerAds