2017-05-30 85 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