13

さて、ほとんどすべてのチュートリアル/理解可能な人間の言語で書かれたドキュメントは 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)

と呼ばれていますが、正直なところ、それが何をしていて、どこに何を接続しているのかわかりません。

Main クラスでは、QMainWindow から継承して、次のメソッドを記述します。

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

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

お願いします、誰かそれを手伝ってくれませんか?

4

1 に答える 1

24

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

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

特定のケースでは、構文は次のとおりです。

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

def change_text(self):
    self.ui.testLabel.setText("Button Clicked!")
于 2013-11-14T00:15:29.193 に答える