【问题标题】:Drag and drop from one QListView to another QListView从一个 QListView 拖放到另一个 QListView
【发布时间】:2020-06-18 03:14:43
【问题描述】:

我想实现从一个QListView 到另一个的拖放功能。拖放操作会将拖动项目的文本复制到另一个QListView。我希望拖放是单向的,我的意思是从 QListView A 到 QListView B 但不是相反。为此,我从QListView 派生了两个类,一个用于可拖动视图,一个用于可放置视图。不幸的是,这失败了,我无法拖放我的项目。这是到目前为止我可以得出的代码:

import sys

from PyQt5.QtWidgets import QListView, QApplication

from PyQt5.QtGui import QStandardItemModel, QStandardItem

from PyQt5 import QtCore


class DraggableListView(QListView):

    def __init__(self, parent):
        super().__init__(parent)

        self.setDragEnabled(True)

    def flags(self, index):

        flags = super(DraggableListView, self).flags(index)

        if index.isValid():
            return flags | QtCore.Qt.ItemIsDragEnabled


class DroppableListView(QListView):

    def __init__(self, parent):
        super().__init__(parent)

        self.setDefaultDropAction(QtCore.Qt.CopyAction)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)

    def dragMovEvent(self, e):
        e.accept()

    def dragEnterEvent(self, e):

        if e.mimeData().hasFormat('text/plain'):
            e.accept()
        else:
            e.ignore()

    def dropEvent(self, e):

        item = QStandardItem(e.mimeData().text())
        self.model().appendRow(item)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        draggable_list_view = DraggableListView(self)
        draggable_list_view.setDragEnabled(True)
        draggable_list_view.move(30, 65)
        model1 = QStandardItemModel()
        draggable_list_view.setModel(model1)
        for it in ['yo', 'yi', 'ya']:
            item = QStandardItem(it)
            model1.appendRow(item)

        droppable_list_view = DroppableListView(self)
        droppable_list_view.move(190, 65)
        model2 = QStandardItemModel()
        droppable_list_view.setModel(model2)

        self.setGeometry(300, 300, 300, 150)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_()


if __name__ == '__main__':
    main()

你有什么想法/提示让它工作吗?

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    没有必要重写 QListView 的任何方法,因为只需要启用标志:

    import sys
    
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    from PyQt5.QtWidgets import QListView, QApplication, QWidget, QHBoxLayout
    
    
    class Example(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            draggable_list_view = QListView()
            draggable_list_view.setDragEnabled(True)
            model1 = QStandardItemModel()
            draggable_list_view.setModel(model1)
            for it in ["yo", "yi", "ya"]:
                item = QStandardItem(it)
                model1.appendRow(item)
    
            droppable_list_view = QListView()
            droppable_list_view.setAcceptDrops(True)
            droppable_list_view.setDropIndicatorShown(True)
            model2 = QStandardItemModel()
            droppable_list_view.setModel(model2)
    
            lay = QHBoxLayout(self)
            lay.addWidget(draggable_list_view)
            lay.addWidget(droppable_list_view)
    
            self.setGeometry(300, 300, 300, 150)
    
    
    def main():
    
        app = QApplication(sys.argv)
        ex = Example()
        ex.show()
        app.exec_()
    
    
    if __name__ == "__main__":
        main()
    

    注意:从任何模型中拖动项目时,不使用 mimetype“text/plain”,而是使用自定义 mimetype“application/x-qabstractitemmodeldatalist”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多