PyQt6教程-如何接收信号参数

PyQt6 Tutorial - how to receiving signal parameters

我是 Python Qt 编程的新手。我一直在 link 学习教程 - https://www.pythonguis.com/tutorials/pyqt6-signals-slots-events/

我无法理解的教程部分在“接收数据”部分下

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press Me!")
        button.setCheckable(True)
        button.clicked.connect(self.the_button_was_clicked)
        button.clicked.connect(self.the_button_was_toggled)

        self.setCentralWidget(button)

    def the_button_was_clicked(self):
        print("Clicked!")

    def the_button_was_toggled(self, checked):
        print("Checked?", checked)

问题

  1. 作者如何能够将参数 'checked' 传递给函数“the_button_was_toggled”,因为在连接信号 'clicked' 时我们没有为函数指定任何参数。对我来说,这似乎更像是一件神奇的事情,而不是我通过阅读有关从信号接收参数到插槽
  2. 的相关文档来理解的东西
  3. 有人可以提供与 PyQt6 文档或教程相关的 link 以更好地理解这一点

感谢您的宝贵时间

Qt 文档是查找 Qt 功能描述的好地方。有一节关于 signals and slots 提到这种行为:

The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)

这意味着您不需要在函数定义中包含信号可用的所有参数。 Qt 有逻辑来检查您传递给 connect() 的函数并确定该函数需要的参数数量。虽然 Qt 在 C++ 中实现了这一点,但您可以在自己的 Python 程序中执行相同的操作。我找到了一个 SO thread,它提供了很多选择。

这是一个例子:

from inspect import signature


def pass_only_requested_args(function_ref):
    args = [1, 2, 3]
    sig = signature(function_ref)
    number_of_parameters = len(sig.parameters)
    function_ref(*args[:number_of_parameters])
    
def function_1(p1):
    print(f"function 1 => {p1}")
    
def function_2(p1, p2):
    print(f'{p1} {p2}')
    
pass_only_requested_args(function_1)
pass_only_requested_args(function_2)

输出为:

function 1 => 1
1 2