Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从一个列表中拖放复制,但使用“移动”进行内部拖放_Python_Drag And Drop_Pyqt_Qlistwidget_Qlistwidgetitem - Fatal编程技术网

Python 如何从一个列表中拖放复制,但使用“移动”进行内部拖放

Python 如何从一个列表中拖放复制,但使用“移动”进行内部拖放,python,drag-and-drop,pyqt,qlistwidget,qlistwidgetitem,Python,Drag And Drop,Pyqt,Qlistwidget,Qlistwidgetitem,我需要能够将一个项目从一个listWidget复制到另一个listWidget。这很容易做到,但我似乎无法找到一种方法来区分拖放操作,这种方法基于被拖动的项是否起源于它被拖放到的列表,而无需使用我自己的函数覆盖几乎所有的拖放函数。当我将一个项目从一个列表拖动到另一个列表时,我想复制它,但当我拖动同一列表中的项目时,我想移动它 我一直在考虑设置mimetypes,但后来我不得不编写自己的mouseMoveEvent,作为一种可能的方式来告诉拖动的项目是从哪里来的,但到目前为止,尝试这样做会破坏一切

我需要能够将一个项目从一个listWidget复制到另一个listWidget。这很容易做到,但我似乎无法找到一种方法来区分拖放操作,这种方法基于被拖动的项是否起源于它被拖放到的列表,而无需使用我自己的函数覆盖几乎所有的拖放函数。当我将一个项目从一个列表拖动到另一个列表时,我想复制它,但当我拖动同一列表中的项目时,我想移动它

我一直在考虑设置mimetypes,但后来我不得不编写自己的mouseMoveEvent,作为一种可能的方式来告诉拖动的项目是从哪里来的,但到目前为止,尝试这样做会破坏一切。如果不重写mouseMoveEvent,是否无法为项设置mime类型

由于我正在拖动的项目是定制的,所以当它被移动或复制到第二个列表时,我必须编写自己的定义来重建它。使用默认的拖动功能,这一切都可以很好地用于内部移动。但到目前为止,我还没有弄清楚,当拖动是一个内部移动时,如何使用默认的拖放功能,然后当拖放来自不同的列表时,如何切换到我的自定义功能来复制该项

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

这就是我想到的。我在单击项时设置一个类数据变量,以便在删除项时可以知道它来自何处。我尝试在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()

这就是我想到的。我在单击项时设置一个类数据变量,以便在删除项时可以知道它来自何处。我尝试在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()

辨别拖动是来自此小部件还是来自其他小部件是很简单的——只需在任何拖放事件中使用事件源即可。例如:

void MyWidget::dragmovevent(qdragmovevent*event)
{
如果(事件->源()!=此){
//拖动来自另一个小部件
}
}

很容易辨别拖动是来自此小部件还是来自其他小部件——只需在任何拖放事件中使用事件源即可。例如:

void MyWidget::dragmovevent(qdragmovevent*event)
{
如果(事件->源()!=此){
//拖动来自另一个小部件
}
}