您可以定义自己的插槽(任何可调用的python)并将其连接到信号,然后从该插槽中调用其他插槽。
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def printLabel(self, str): print(str) def logLabel(self, str): '''log to a file''' pass @QtCore.pyqtSlot(int) def on_sld_valueChanged(self, value): self.lcd.display(value) self.printLabel(value) self.logLabel(value) def initUI(self): self.lcd = QLCDNumber(self) self.sld = QSlider(Qt.Horizontal, self) vbox = QVBoxLayout() vbox.addWidget(self.lcd) vbox.addWidget(self.sld) self.setLayout(vbox) self.sld.valueChanged.connect(self.on_sld_valueChanged) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Signal & slot')另外,如果要定义自己的信号,则必须将它们定义为类变量
class Example(QWidget): my_signal = pyqtSignal(int)
用于
pyqtSignal定义将
emit在该信号上显示的对象类型的参数,因此在这种情况下,您可以执行
self.my_signal.emit(1)
可以重新实现发射,以将特定的信号值发送到插槽功能。还不清楚我为什么需要从以前存在的信号方法中发送不同的值。
通常,您不应该发出内置信号。您只需要发出定义的信号即可。定义信号时,可以定义具有不同类型的不同签名,插槽可以选择它们要连接到的签名。例如,您可以这样做
my_signal = pyqtSignal([int], [str])
这将定义一个具有两个不同签名的信号,并且一个插槽可以连接到任何一个
@pyqtSlot(int)def on_my_signal_int(self, value): assert isinstance(value, int)@pyqtSlot(str)def on_my_signal_str(self, value): assert isinstance(value, str)
实际上,我很少过载信号签名。通常,我只创建两个具有不同签名的单独信号,而不是使同一信号过载。但它的存在和PyQt的支持,因为Qt拥有被重载这样的信号(如
QComboBox.currentIndexChanged)



