わかりましたので、ほとんどすべてのチュートリアル/理解可能な人間の言語で書かれたドキュメントは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はそのような単純な設定を廃止して破棄しました。
誰か、私を助けてくれませんか?
「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!")