【问题标题】:PyQt - object has no attribute 'connect'PyQt - 对象没有属性“连接”
【发布时间】:2017-05-30 06:44:10
【问题描述】:

我正在使用 PyQt5,我想做一个拖放系统。

我得到了这篇帖子的代码:PyQT4: Drag and drop files into QListWidget

当我运行时,出现以下错误:AttributeError: 'MainForm' object has no attribute 'connect'

代码:

import sys
import os
from PyQt5.Qt import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class TestListView(QListWidget):
    def __init__(self, type, parent=None):
        super(TestListView, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QSize(72, 72))

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(Qt.SIGNAL("dropped"), links)
        else:
            event.ignore()

class MainForm(QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.view = TestListView(self)
        self.connect(self.view, Qt.SIGNAL("dropped"), self.pictureDropped)
        self.setCentralWidget(self.view)

    def pictureDropped(self, l):
        for url in l:
            if os.path.exists(url):
                print(url)
                icon = QIcon(url)
                pixmap = icon.pixmap(72, 72)
                icon = QIcon(pixmap)
                item = QListWidgetItem(url, self.view)
                item.setIcon(icon)
                item.setStatusTip(url)

def main():
    app = QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    问题是您使用的是旧形式的连接,您必须更新以下内容:

    创建信号:

    class TestListView(QListWidget):
        dropped = pyqtSignal(list)
    

    也改变:

    self.emit(Qt.SIGNAL("dropped"), links)
    

    到:

    self.dropped.emit(links)
    

    然后改变:

    self.connect(self.view, Qt.SIGNAL("dropped"), self.pictureDropped)
    

    到:

    self.view.dropped.connect(self.pictureDropped)
    

    更多信息可以阅读here

    完整代码:

    import sys
    import os
    from PyQt5.Qt import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    class TestListView(QListWidget):
        dropped = pyqtSignal(list)
        def __init__(self, type, parent=None):
            super(TestListView, self).__init__(parent)
            self.setAcceptDrops(True)
            self.setIconSize(QSize(72, 72))
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls:
                event.accept()
            else:
                event.ignore()
    
        def dragMoveEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(Qt.CopyAction)
                event.accept()
            else:
                event.ignore()
    
        def dropEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(Qt.CopyAction)
                event.accept()
                links = []
                for url in event.mimeData().urls():
                    links.append(str(url.toLocalFile()))
                self.dropped.emit(links)
            else:
                event.ignore()
    
    class MainForm(QMainWindow):
        def __init__(self, parent=None):
            super(MainForm, self).__init__(parent)
    
            self.view = TestListView(self)
            self.view.dropped.connect(self.pictureDropped)
            self.setCentralWidget(self.view)
    
        def pictureDropped(self, l):
            for url in l:
                if os.path.exists(url):
                    print(url)
                    icon = QIcon(url)
                    pixmap = icon.pixmap(72, 72)
                    icon = QIcon(pixmap)
                    item = QListWidgetItem(url, self.view)
                    item.setIcon(icon)
                    item.setStatusTip(url)
    
    def main():
        app = QApplication(sys.argv)
        form = MainForm()
        form.show()
        app.exec_()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • 如何将它与 QWidget 而不是 QListWidget 一起使用?
    • 如果我想从 QWidget 而不是 QListWidget 继承,我需要更改什么?
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2019-01-26
    • 2011-02-27
    • 2021-06-15
    • 2020-10-02
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多