1 回答

TA貢獻1853條經驗 獲得超18個贊
使用SIGNAL()
宏多年來一直被認為是過時的,并且“新樣式”信號和槽語法必須始終用于新代碼。
此外,SIGNAL 語法應該始終有一個(可能為空)參數類型列表作為其簽名。PyQt 過去支持所謂的“短路信號”,它允許將沒有正確簽名的自定義信號連接到 python 可調用對象,并且可以發出具有任意數量和類型參數的信號。通過使用不帶括號的信號可以實現這一點。
如前所述,此語法已過時,并且 pyside 還刪除了對這些短路信號的支持,如PySide 和 PyQt 之間的差異頁面中所述:
由于這是一個舊的且已棄用的功能,并且修復此問題的努力不值得,因此我們決定不實現它。在 PySide 代碼中,您需要使用類似以下內容:
self.emit(SIGNAL ('text_changed_cb(QString)'), text)
在你的情況下,由于你沒有使用參數,所以它應該是這樣的:
self.connect(self.ui.DragDropEncode,?SIGNAL("dropped()"),?self.add_file)
但是,如前所述,這是一個古老且已棄用的功能(而且也太冗長且不太Pythonic)。
解決方案是為類創建信號并直接發出它們:
class DragDropWidget(QWidget):
? ? dropped = Signal(str)
? ? # ...
? ? def dropEvent(self, event):
? ? ? ? # ...
? ? ? ? self.dropped.emit(url)
然后將實例的信號連接到插槽:
self.ui.DragDropEncode.dropped.connect(self.add_file)
請注意,發出信號時必須遵守參數簽名。在上面的情況下,根據您的代碼,我假設您將 mimeData 的 QUrl 轉換為字符串。如果您需要發出 QUrl,信號必須反映:
class DragDropWidget(QWidget):
? ? dropped = Signal(QUrl)
或者,有兩種可能性:您可以使用允許發出任何類型的參數 ( ) 的通用 簽名,或使用信號重載。在這種情況下,您可以使用能夠發出各種參數長度和類型的單個信號。在這種情況下,將使用第一個重載作為默認值,而其他重載必須用方括號選擇:objectdropped = Signal(object)emit
class DragDropWidget(QWidget):
? ? dropped = Signal([str], [QUrl])
? ? # ...
? ? def dropEvent(self, event):
? ? ? ? # ...
? ? ? ? url = event.mimeData().urls()[0]
? ? ? ? self.dropped.emit(url.toLocalFile())
? ? ? ? self.dropped[QUrl].emit(url)
如果您需要根據信號簽名連接到不同的插槽,這會很有用:
? ? self.ui.DragDropEncode.dropped.connect(self.function_that_uses_strings)
? ? self.ui.DragDropEncode.dropped[QUrl].connect(self.function_that_uses_urls)
添加回答
舉報