簡體   English   中英

如何在qlistwidget上獲取從dropEvent創建的項目

[英]How to get the item created from dropEvent on a qlistwidget

所以我試圖使用拖放功能將選定的項目從一個QListWidget復制到另一個。

無論如何,我可能通過使用item.setData傳遞序列化參數來破解我需要的東西,但是我無法想出一個直接的方法來獲取在第二個listWidget中創建的新項目的句柄。

我想我可以查看第二個QListWidget中的所有項目,並以某種方式確定哪一個剛剛創建,但似乎應該有一種更簡單的方法來了解drop事件正在創建哪個項目。

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):
        print('dropEvent') 
        print event.mimeData().text()

        if event.mimeData().hasText():
            print event.mimeData().text()
            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)
            super(DragDropListWidget, self).dropEvent(event)
            items = []
            for index in xrange(self.count()):
                items.append(self.item(index))
                print self.item(index).data(QtCore.Qt.UserRole).toPyObject()



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

您可以連接到listview模型上的rowsInserted信號

class DragDropListWidget(...):

    def __init__(...):
        ...
        self._dropping = False
        self.model().rowsInserted.connect(self.on_rowsInserted)

    def on_rowsInserted(self, parent_index, start, end):
        if self._dropping:
            # Recently dropped items
            items = [self.item(i) for i in range(start, end + 1)]

    def dropEvent(self, event):
        self._dropping = True
        # code that drops the new rows
        ...
        self._dropping = False

有趣..好吧,我的解決方案最終是在第二個listwidget中存儲項目列表,然后在添加新項目之后進行比較,該項目運行良好並且只需幾行代碼。 然后我將新項目傳遞給一個函數,該函數使用在第一個listwidget中創建項目時使用的相同類來創建項目,並且我傳遞了.data中的序列化信息(QtCore.Qt.UserRole)

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM