web-dev-qa-db-ja.com

PyQt5:QPushButtonをスロットに接続するにはどうすればよいですか?

わかりましたので、ほとんどすべてのチュートリアル/理解可能な人間の言語で書かれたドキュメントはPyQt4向けです。しかし、PyQt5は「スロットへの接続ボタン」全体の動作を変更しましたが、それを行う方法はまだわかりません。

QtDesignerで簡単なGUIを実行し、QPushButtonとラベルを用意しました。ボタンをクリックすると、ラベルのテキストを変更します。 QtDesignerのC++では、2つを接続するのは簡単です。しかし、私はそれをすべてpythonで書かなければなりません。

Pyuic5の.uiファイルを.pyファイルに変換します。そこで、Ui_MainWindowクラスで、次のようにself.buttonを初期化するsetupUiメソッドを確認できます。

self.testButton = QtWidgets.QPushButton(self.centralWidget)
self.testButton.setObjectName("newGame")

次に、メソッドの最後に、

QtCore.QMetaObject.connectSlotsByName(MainWindow)

と呼ばれていますが、正直なところ、何がどこで何につながるのかわかりません。

qMainWindowから継承したMainクラスで、次のメソッドを記述します

@pyqtSlot(name='change')
def change_text(self):
    self.ui.testLabel.setText("Button Clicked!")

そして、ボタン信号をそのスロットに接続する方法がわかりません。 pyqt4では、button.clicked.connect(self.change_text)を実行して手動で設定できましたが、PyQt5はそのような単純な設定を廃止して破棄しました。

誰か、私を助けてくれませんか?

11
Ian Traum

「PyQt5が「スロットへの接続ボタン」全体の動作を変更した」という考えがどこで得られたのかはわかりませんが、それは完全かつ完全に間違っています。 PyQtの公式ドキュメントからすぐにわかるように、そのような変更はありません。

しかし、ドキュメントを読まなくても、自分でテストするのは簡単です。たとえば、次のスクリプトでは、最初の2行のコメントを切り替えるだけで、同じように実行されます。

# from PyQt5.QtWidgets import (
from PyQt4.QtGui import (
    QApplication, QWidget, QVBoxLayout, QPushButton, QLabel,
    )

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QPushButton('Test', self)
        self.label = QLabel(self)
        self.button.clicked.connect(self.handleButton)
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.button)

    def handleButton(self):
        self.label.setText('Button Clicked!')

if __name__ == '__main__':

    import sys
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

他の点については、あなたの現在の知識の状態では、connectSlotsByNamepyqtSlotは無視しても問題ありません。それらには用途がありますが(詳細については上記のドキュメントを参照)、アプリケーションの95%で実際に使用する必要はほとんどありません。

あなたの特定のケースでは、構文は単純です:

    self.testButton.clicked.connect(self.change_text)
    ...

def change_text(self):
    self.ui.testLabel.setText("Button Clicked!")
21
ekhumoro