В Qt мы можем создавать пользовательские сигналы, делая их статическими переменными. и затем мы используем self.signame вместо classname.signame. Это создает переменную экземпляра в классе.

Я хотел бы узнать теорию, которая лежит в основе этого шаблона.

вот некоторый псевдокод, который я пробовал и который был записан в большинстве источников:

from PyQt5 import QtWidgets,QtCore
class test(QtWidgets.QApplication):
    sig=QtCore.pyqtSignal([bool])
    def __init__(self):
        super().__init__([])
        # self.sig=QtCore.pyqtSignal([bool]) #1
        self.window=QtWidgets.QWidget()
        self.sig.connect(lambda x=True:print('Hello World'))
        self.bt=QtWidgets.QPushButton(self.window,text='test',clicked=self.sig)
        self.window.setLayout(QtWidgets.QVBoxLayout())
        self.window.layout().addWidget(self.bt)
        self.window.show()
test().exec()

Когда я пытаюсь получить доступ к сигналу test.sig вместо self.sig,

from PyQt5 import QtWidgets,QtCore
class test(QtWidgets.QApplication):
    def __init__(self):
        super().__init__([])
        self.sig=QtCore.pyqtSignal([bool])
        self.window=QtWidgets.QWidget()
        self.sig.connect(lambda x=True:print('Hello World'))
        self.bt=QtWidgets.QPushButton(self.window,text='test',clicked=self.sig)
        self.window.setLayout(QtWidgets.QVBoxLayout())
        self.window.layout().addWidget(self.bt)
        self.window.show()
test().exec()

Я получаю эту ошибку:

    test.sig.connect(lambda x=True:print('Hello World'))
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

и когда я попытался сделать сигнал переменной экземпляра вместо статической переменной, я получил эту ошибку (некомментируя #1 в коде psudeo)

.

Я получаю ту же ошибку (как и раньше).

Можно ли узнать причину этого

Источник: PyQt5

Rahul A Ranger

Ответов: 1

Ответы (1)

Следует отметить, что pyqtSignal объявлен как атрибут класса, но это не тот же объект, который используется в соединении, как указано в документах:

.

Сигнал (в частности, несвязанный сигнал) - это атрибут класса. Когда сигнал упоминается как атрибут экземпляра класса, то PyQt5 автоматически связывает этот экземпляр с сигналом, чтобы создать связанный сигнал. Это тот же механизм, который сам Python использует для создания связанных методов из функций класса.

Связанный сигнал имеет методы connect(), disconnect() и emit(). которые реализуют связанную функциональность. Он также имеет атрибут signal который является сигнатурой сигнала, возвращаемого макросом Qt SIGNAL() макросом.

Иными словами, sig = QtCore.pyqtSignal([bool]) является несвязанным сигналом, но self.sig является связанным сигналом, и это можно проверить с помощью следующих строк:

from PyQt5 import QtWidgets, QtCore


class test(QtWidgets.QApplication):
    sig = QtCore.pyqtSignal([bool])

    print(type(sig))

    def __init__(self):
        super().__init__([])
        self.window = QtWidgets.QWidget()
        print(type(self.sig))
        self.sig.connect(lambda x=True: print("Hello World"))
        self.bt = QtWidgets.QPushButton(self.window, text="test", clicked=self.sig)
        self.window.setLayout(QtWidgets.QVBoxLayout())
        self.window.layout().addWidget(self.bt)
        self.window.show()


test().exec()

Выход



В заключение, атрибут класса "sig" является pyqtSignal, у которого нет метода connect, и который используется для построения атрибута "self.x", который является pyqtBoundSignal, у которого есть метод connect.

2022 WebDevInsider