【发布时间】: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()
你有什么想法/提示让它工作吗?
【问题讨论】: