PyQt 模拟实现QSignalMapper 实现多个按钮点击监控

时间:2024-07-13 07:55:52

QSignalMapper 类用来接受多个信号,将信号汇总后再发射一个新信号。

用处主要是使多个执行类似功能的槽函数化简为一个;

QSignalMapper 类在 PyQt 中已经被废弃,并且在较新版本的 PyQt 中已经不存在这个类。

在 PyQt 中,我们可以使用 QSignal 的参数传递机制或者使用 lambda 函数来实现 QSignalMapper 的功能。

以下是一个使用 lambda 函数的例子,它模拟了 QSignalMapper 的功能:

from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import QObject, pyqtSlot
 
class SignalMapper(QObject):
    def __init__(self, parent=None):
        super(SignalMapper, self).__init__(parent)
 
    @pyqtSlot(QPushButton)
    def mapSignal(self, button):
        print(f"Button {button.text()} was clicked!")
 
def main():
    app = QApplication([])
    window = QWidget()
    layout = QVBoxLayout()
 
    signal_mapper = SignalMapper()
 
    buttons = [QPushButton(f"Button {i}") for i in range(5)]
    for button in buttons:
        button.clicked.connect(lambda checked, button=button: signal_mapper.mapSignal(button))
 
    for button in buttons:
        layout.addWidget(button)
 
    window.setLayout(layout)
    window.show()
 
    app.exec_()
 
if __name__ == "__main__":
    main()