2017-05-30 84 views
0

我正在使用PyQt5,我想做一个拖动系统&。PyQt - 对象没有属性'连接'

我对这个职位代码:PyQT4: Drag and drop files into QListWidget

当我跑,我得到了以下错误:AttributeError的: 'MainForm的' 对象有没有属性 '连接'

代码:

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() 

回答

3

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

创建信号:

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() 
+0

事实上,它就像一个魅力。非常感谢! –

+0

我怎么能用QWidget而不是QListWidget? –

+0

我不理解你,更好地解释你自己。 – eyllanesc