未知的python语法(function_name [数据类型]) - 想了解更多信息

问题描述 投票:-4回答:1

我正在寻找有关这种语法的更多信息

function_name [数据类型]

我不知道这叫什么,所以我希望有人能指出我正确的方向。我已经习惯了这种语法,在列表和字典中引用了值,但对函数定义却没那么多。

我在关注PyQt5教程时遇到过这个,特别是这个

http://zetcode.com/gui/pyqt5/widgets/

其中包含此行

sld = QSlider(Qt.Horizontal, self)
...
sld.valueChanged[int].connect(...)

从Qt5文档中我可以看到这是信号函数的定义

valueChanged(int value)

https://doc.qt.io/qt-5.11/qabstractslider.html#signals

谢谢,

python syntax pyqt5
1个回答
2
投票

在C ++中编码Qt时,您可以使用称为方法重载的C ++技术使用具有不同签名的插槽订阅信号。 Qt将根据更改值的参数类型调用正确的插槽。 Qt documentation on slots使用重载的display()插槽定义作为示例:

public slots:
    void display(int num);
    void display(double num);
    void display(const QString &str);
    // ...

并将display连接到一个可以在变化时发送int值的信号将连接到这些中的第一个。

另一方面,Python没有这样的概念。 Python是动态类型的,函数定义不包括类型信息。

因此,围绕QT的PyQT包装器允许您通过在信号上使用Python的subscription syntax来定义所期望的参数类型,您使用相同的语法来处理列表中的索引和切片或字典中的键。使用此功能,您可以将插槽连接到信号的特定“变体”。信号不是这种情况下的方法,它们是支持订阅的自定义包装器对象,而signal[type]的结果是一个更具体的信号对象,然后您可以连接到或断开连接,并且只会调用插槽具体类型。

对于您的示例,QAbstractSlider.valueChanged`信号只有一个变体,一个发出整数:

void    valueChanged(int value)

所以在Python中你可以通过valueChanged[int]绑定该变体。如果信号不带参数,则可以直接使用signal,无需订阅;例如sliderPressed。事实上,您可以使用任何信号,但如果有多个重载,则选择默认值;在这种情况下,您可能需要检查.signal属性以查看将要使用的属性。

请参阅PyQT5手册中的Signals and Slots documentation

绑定信号具有实现相关功能的connect()disconnect()emit()方法。它还有一个signal属性,它是Qt的SIGNAL()宏返回的信号的签名。

信号可能过载,即。具有特定名称的信号可能支持多个签名。可以用签名索引信号以便选择所需的信号。 [...]

如果信号过载,那么如果没有给出索引,它将具有默认值。

© www.soinside.com 2019 - 2024. All rights reserved.