亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

拖放小部件實現錯誤 - RuntimeWarning:

拖放小部件實現錯誤 - RuntimeWarning:

開心每一天1111 2023-10-05 17:36:15
這是我為此創建的自定義小部件:from PySide2.QtCore import *from PySide2.QtWidgets import *from PySide2.QtGui import *import osclass DragDropWidget(QWidget):    def __init__(self, parent=None):        super(DragDropWidget, self).__init__(parent)        self.setAcceptDrops(True)    def dragEnterEvent(self, event):        if event.mimeData().hasUrls:            event.accept()        else:            event.ignore()    def dragMoveEvent(self, event):        if event.mimeData().hasUrls:            if len(event.mimeData().urls()) != 1:                event.ignore()            else:                event.setDropAction(Qt.CopyAction)                event.accept()        else:            event.ignore()    def dropEvent(self, event):        if event.mimeData().hasUrls:            event.setDropAction(Qt.CopyAction)            event.accept()            if len(event.mimeData().urls()) != 1:                event.ignore()            else:                url = event.mimeData().urls()[                    0].toLocalFile()                if os.path.exists(url):                    self.emit(SIGNAL("dropped"), url)        else:            event.ignore()我可以從 dropEvent 函數打印出文件的位置,但無法使用 connect 從主函數訪問它。我的主要功能有以下幾行:self.connect(self.ui.DragDropEncode, SIGNAL("dropped"), self.add_file)def add_file(self, file):    print(file)我已經使用以下命令從另一個文件導入了我的用戶界面:from Main_UI import Ui_MainWindow我有這個小部件的以下代碼:   self.DragDropEncode = DragDropWidget(self.AddFileEncode)   self.DragDropEncode.setAcceptDrops(True)當我運行主文件時,出現以下錯誤:main.py:55: RuntimeWarning: MetaObjectBuilder::addMethod: Invalid method signature provided for "dropped"  self.connect(self.ui.DragDropEncode, SIGNAL("dropped"), self.add_file)此外,刪除文件絕對沒有任何作用。我仍然不明白為什么會出現這個錯誤。任何幫助將非常感激。謝謝你!
查看完整描述

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)


查看完整回答
反對 回復 2023-10-05
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號