2017-05-30 13 views
0

私はPyQt5を使用していますが、ドラッグを&ドロップシステムにしたいと思います。私は実行するとPyQT4: Drag and drop files into QListWidgetPyQt - オブジェクトには属性 '接続'がありません

が、私は次のエラーを得た:は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

QListWidgetではなくQWidgetでどのように使用できますか? –

+0

私はあなたを理解していない、自分自身をよりよく説明する。 – eyllanesc

関連する問題