Использование слотов автоматического подключения по имени - PullRequest
0 голосов
/ 18 января 2019

Некоторое время назад я использовал (в заданной структуре на работе) функцию автоматического соединения слотов по имени в Qt4 с декоратором.Примерно так:

self.button1 = QtWidgets.QPushButton("Click me!")
...
@QtCore.Slot()
def on_button1_clicked(self):
     # whatever the method does...

вместо этого:

self.button1 = QtWidgets.QPushButton("Click me!")
self.button1.clicked.connect(self.handle_button)
...
def self.handle_button(self):
    # whatever the method does...

Теперь я не могу заставить его работать с PySide2 (Qt-5.12).Чего мне не хватает здесь, чтобы заставить его работать?

import sys
import random
from PySide2 import QtCore, QtWidgets, QtGui

class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.hello = ["Hallo Welt", "Hola Mundo"]

        self.button1 = QtWidgets.QPushButton("Click me!")
        self.text = QtWidgets.QLabel("Hello World")
        self.text.setAlignment(QtCore.Qt.AlignCenter)

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button1)
        self.setLayout(self.layout)

        QtCore.QMetaObject.connectSlotsByName(self)

        #self.button1.clicked.connect(self.on_button1_clicked)

    @QtCore.Slot()
    def on_button1_clicked(self):
        self.text.setText(random.choice(self.hello))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

widget = MyWidget()
widget.show()

sys.exit(app.exec_())

1 Ответ

0 голосов
/ 18 января 2019

Функция connectSlotsByName обычно используется с файлами Qt Designer. Когда эти файлы конвертируются с помощью инструмента uic, добавляется много кода. Это включает установку имени объекта, которое требуется при соединении слотов по имени:

self.button1 = QtWidgets.QPushButton("Click me!")
self.button1.setObjectName('button1')

Очевидно, имя объекта должно совпадать с именем, используемым в слоте.

...