![](/img/trans.png)
[英]Python throwing strange NameError: name <function_name> is not defined
[英]unknown python syntax (function_name[data type]) - want more info
我正在尋找有關這種語法的更多信息
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
謝謝,
在 C++ 中編碼 Qt 時,您可以使用稱為方法重載的 C++ 技術使用具有不同簽名的槽來訂閱信號。 Qt 將根據更改值的參數類型調用正確的插槽。 關於插槽的Qt 文檔使用重載的display()
插槽定義作為示例:
public slots:
void display(int num);
void display(double num);
void display(const QString &str);
// ...
並將display
連接到可以在更改時發送int
值的信號將連接到其中的第一個。
另一方面,Python 沒有這樣的概念。 Python 是動態類型的,函數定義不包含類型信息。
因此,圍繞 QT 的 PyQT 包裝器允許您通過在信號上使用 Python 的訂閱語法來定義期望的參數類型,這與您用於處理列表中的索引和切片或字典中的鍵的語法相同。 使用它,您可以將您的插槽連接到信號的特定“變體”。 在這種情況下,信號不是方法,它們是支持訂閱的自定義包裝器對象,並且該signal[type]
的結果是一個更具體的信號對象,然后您可以連接到或斷開連接,並且插槽將永遠是調用該特定類型。
對於您的示例, QAbstractSlider.valueChanged` 信號只有一種變體,它發出一個整數:
void valueChanged(int value)
因此,在 Python 中,您可以通過valueChanged[int]
綁定該變體。 如果信號不帶參數,則可以直接使用signal
,無需訂閱; 例如sliderPressed
。 實際上,您可以以這種方式使用任何信號,但是如果有多個重載,則會選擇默認值; 在這種情況下,您可能需要檢查.signal
屬性以查看將使用.signal
屬性。
請參閱 PyQT5 手冊中的 信號和插槽文檔:
綁定信號具有實現相關功能的
connect()
、disconnect()
和emit()
方法。 它還有一個signal
屬性,它是 Qt 的SIGNAL()
宏返回的信號的簽名。信號可能過載,即。 具有特定名稱的信號可能支持多個簽名。 可以使用簽名對信號進行索引,以便選擇所需的信號。 [...]
如果信號過載,那么它將有一個默認值,如果沒有給出索引,則將使用該默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.