2016-10-21 5 views
0

1つのリストウィジェットから別のリストウィジェットにアイテムをコピーする必要があります。これはやりやすいほど簡単ですが、ドラッグされているアイテムがドロップされているかどうかに基づいてドロップアクションを区別する方法を見つけることはできません。ほとんどすべてのドラッグアンドドロップ機能を自分の。あるリストから別のリストにアイテムをドラッグすると、そのアイテムをコピーしたいのですが、同じリストにアイテムをドラッグすると、そのアイテムを移動します。1つのリストからドラッグ&ドロップでコピーできますが、内部ドラッグ&ドロップでは移動を使用します

私はmimetypesの設定を検討してきましたが、ドラッグされた項目がどこから来ているのかを示す方法として私自身のmouseMoveEventを記述する必要がありました。 mouseMoveEventをオーバーライドしないでアイテムのMIMEタイプを設定することはできませんか?

私がドラッグしている項目はカスタマイズされているので、2番目のリストに移動またはコピーされたときに、自分で定義して再構築する必要があります。デフォルトのドラッグ機能では、これはすべて内部動作でうまく動作します。しかし、これまでのところ、ドラッグが内部移動である場合にデフォルトのドラッグドロップ関数を使用する方法を理解できず、ドロップが別のリストから来たときにアイテムをコピーするカスタム関数に切り替えました。

import sys 
from PyQt4 import QtGui , QtCore 


def main(): 

    app = QtGui.QApplication(sys.argv) 

    w = QtGui.QWidget() 
    w.resize(250, 150) 
    w.move(300, 300) 
    w.setWindowTitle('Simple') 
    layout=QtGui.QHBoxLayout(w) 
    dragList=DragDropListWidget() 
    layout.addWidget(dragList) 
    dragList.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
    dragList.name='dragList' 
    dragList.populate(['one','two','three']) 
    dragList2=DragDropListWidget() 
    dragList2.setDragDropMode(QtGui.QAbstractItemView.DragDrop) 
    dragList2.name='dragList' 


    layout.addWidget(dragList2) 
    w.show() 

    sys.exit(app.exec_()) 

class scriptsWidget(QtGui.QWidget): 


    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self) 

     self.name='' 

     self.widget_QHBoxLayout = QtGui.QHBoxLayout(self) 
     self.widget_QHBoxLayout.setSpacing(0) 
     self.widget_QHBoxLayout.setContentsMargins(0, 0, 0, 0) 

     self.name_QLabel = QtGui.QLabel(self) 
     self.widget_QHBoxLayout.addWidget(self.name_QLabel) 

     self.user_QLabel = QtGui.QLabel(self) 
     self.widget_QHBoxLayout.addWidget(self.user_QLabel) 

     self.widget_QHBoxLayout.setSpacing(0) 
     self.widget_QHBoxLayout.setContentsMargins(0, 0, 0, 0) 



    def setName(self,name): 
     self.name_QLabel.setText(name) 
     self.name=name 

    def setUser(self,user): 
     self.user_QLabel.setText(user) 

class customQListWidgetItem(QtGui.QListWidgetItem): 


    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self) 
     self.name='' 

    def setName(self,name): 
     self.name=name 




class DragDropListWidget(QtGui.QListWidget): 
    _drag_info = [] 
    def __init__(self, parent = None): 

     super(DragDropListWidget, self).__init__(parent) 


     self.name='' 


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

     else: 
      super(DragDropListWidget, self).dragMoveEvent(event) 


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

     else: 
      event.setDropAction(QtCore.Qt.CopyAction) 
      items = [] 
      for index in xrange(self.count()): 
       items.append(self.item(index)) 

      super(DragDropListWidget, self).dropEvent(event) 

      for index in xrange(self.count()): 
       if self.item(index) not in items: 
        self.populateDrop(self.item(index), index, [self.item(index).data(QtCore.Qt.UserRole).toPyObject()]) 

    def populateDrop(self,item,row,items=[]): 
     for i in items: 
      widget = scriptsWidget() 
      widget.setName(i) 
      widget.setUser('x') 
      self.takeItem(row) 
      item = customQListWidgetItem() 
      item.setName(i) 
      item.setWhatsThis(i) 
      data = (i) 
      item.setData(QtCore.Qt.UserRole, data) 
      self.insertItem (row, item) 
      self.setItemWidget(item,widget) 



    def populate(self,items=[]): 
     self.clear() 
     for i in items: 
      print(i) 
      widget = scriptsWidget() 
      widget.setName(i) 
      widget.setUser('x') 
      item = customQListWidgetItem() 
      item.setName(i) 
      data = (i) 
      item.setData(QtCore.Qt.UserRole, data) 
      self.addItem(item) 
      self.setItemWidget(item,widget) 



if __name__ == '__main__': 
    main() 

答えて

0

これは私が思いついたものです。アイテムがクリックされたときにクラスデータ変数を設定しているので、そのアイテムがドロップされたときにどこから来たのかを知ることができます。 DragDropListWidgetの内部でクラス変数を使用しようとしましたが、何らかの理由で現在のリストのローカル名しか格納しませんでした。グローバル変数も機能しましたが、望ましくありません。

import sys 
from PyQt4 import QtGui , QtCore 

def main(): 

    app = QtGui.QApplication(sys.argv) 

    w = QtGui.QWidget() 
    w.resize(250, 150) 
    w.move(300, 300) 
    w.setWindowTitle('Simple') 
    layout=QtGui.QHBoxLayout(w) 
    dragList=DragDropListWidget() 
    layout.addWidget(dragList) 
    d=data() 
    dragList.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
    dragList.name='dragList' 
    dragList.populate(['one','two','three']) 
    dragList.data=d 
    dragList2=DragDropListWidget() 
    dragList2.setDragDropMode(QtGui.QAbstractItemView.DragDrop) 
    dragList2.name='dragList2' 
    dragList2.external='dragList2' 
    dragList2.data=d 


    layout.addWidget(dragList2) 
    w.show() 

    sys.exit(app.exec_()) 

class data(object): 
    def __init__(self, parent=None): 
     self.origin='new' 




class scriptsWidget(QtGui.QWidget): 


    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self) 

     self.name='' 

     self.widget_QHBoxLayout = QtGui.QHBoxLayout(self) 
     self.widget_QHBoxLayout.setSpacing(0) 
     self.widget_QHBoxLayout.setContentsMargins(0, 0, 0, 0) 

     self.name_QLabel = QtGui.QLabel(self) 
     self.widget_QHBoxLayout.addWidget(self.name_QLabel) 

     self.user_QLabel = QtGui.QLabel(self) 
     self.widget_QHBoxLayout.addWidget(self.user_QLabel) 

     self.widget_QHBoxLayout.setSpacing(0) 
     self.widget_QHBoxLayout.setContentsMargins(0, 0, 0, 0) 



    def setName(self,name): 
     self.name_QLabel.setText(name) 
     self.name=name 

    def setUser(self,user): 
     self.user_QLabel.setText(user) 

class customQListWidgetItem(QtGui.QListWidgetItem): 


    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self) 
     self.name='' 
     self.list='' 

    def setName(self,name): 
     self.name=name 




class DragDropListWidget(QtGui.QListWidget): 

    def __init__(self, parent = None): 

     super(DragDropListWidget, self).__init__(parent) 
     self._dropping = False 
     self.itemPressed.connect(self.clicked) 

     self.data='' 

     self.name='' 
     self.external='' 
     self.internal=False 

    def clicked(self): 
     global origin 
     self.data.origin=self.name 


    def dragMoveEvent(self, event): 

     if event.mimeData().hasUrls(): 
      event.setDropAction(QtCore.Qt.CopyAction) 
      event.accept() 

     else: 

      super(DragDropListWidget, self).dragMoveEvent(event) 


    def dropEvent(self, event): 

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

     else: 
      if self.external is self.name and self.data.origin is not self.name: 
       print('external') 
       event.setDropAction(QtCore.Qt.CopyAction) 
       items = [] 
       for index in xrange(self.count()): 
        items.append(self.item(index)) 
       print items 

       super(DragDropListWidget, self).dropEvent(event) 

       for index in xrange(self.count()): 
        if self.item(index) not in items: 
         print(index) 
         self.populateDrop(self.item(index), index, [self.item(index).data(QtCore.Qt.UserRole).toPyObject()]) 

      else: 
       print('internal') 
       event.setDropAction(QtCore.Qt.MoveAction) 

       super(DragDropListWidget, self).dropEvent(event) 

     self.data.origin = None  

    def populateDrop(self,item,row,items=[]): 
     for i in items: 
      widget = scriptsWidget() 
      widget.setName(i) 
      widget.setUser('x') 
      self.takeItem(row) 
      item = customQListWidgetItem() 
      item.setName(i) 
      item.setWhatsThis(i) 
      item.list=self.name 
      data = (i) 
      item.setData(QtCore.Qt.UserRole, data) 
      self.insertItem (row, item) 
      self.setItemWidget(item,widget) 



    def populate(self,items=[]): 
     self.clear() 
     for i in items: 
      print(i) 
      widget = scriptsWidget() 
      widget.setName(i) 
      widget.setUser('x') 

      item = customQListWidgetItem() 
      item.setName(i) 
      item.list=self.name 
      data = (i) 
      item.setData(QtCore.Qt.UserRole, data) 
      self.addItem(item) 
      self.setItemWidget(item,widget) 



if __name__ == '__main__': 
    main() 
関連する問題