PyQt5:如何将文本从 QTextEdit 拖到 QlistView 中?

PyQt5: How to drag text from QTextEdit into a QlistView?

我目前正在构建一个 GUI,我想向其中添加从 QTextEdit 中拖动字符串并将其放入 QListView 中的可能性,以便放置的字符串创建一个新行.

但遗憾的是,我对自己应该做什么感到有点困惑。有很多例子,但我看不清楚我应该做什么。

据我所知,我必须重新实现功能,但现在我更像是一只无头鸡。


from PyQt5 import QtCore, QtGui, QtWidgets
import testing_ground_lib, sys


class ListModel(QtGui.QStandardItemModel):
    def supportedDropActions(self):
        <MAYBE DO STUFF HERE>

    def dropMimeData(self, data, action, row, column, modelIndex):
        <MAYBE DO STUFF HERE>

class testing_ground(QtWidgets.QMainWindow, testing_ground_lib.Ui_TestWindow):

    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)

        self.list_model = ListModel(0, 1, self)
        self.inputs_list.setModel(self.list_model)



sys.argv = ['']
app = QtWidgets.QApplication(sys.argv)
testing_ground = testing_ground()
testing_ground.show()
app.exec_()

testing_ground_lib就是通过QtDesigner生成的UI,其中我们有self.inputs_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) 以及定义我的 QTextEdit 小部件的位置 (self.req_editor)

在重新实现的 dropMimeData 中,我试图打印一些东西只是为了看看它是如何工作的,但是当我试图将我的字符串放入 QListView 时它没有做任何事情。

我很清楚我必须实现一些东西,在删除字符串时在 ListView 中追加一行,并使用字符串中的文本设置新项目,我只是无法理解是什么起点.

编辑 :经过进一步调查,我设法通过添加以下内容使该项目可以接受:

    def mimeTypes(self):
        return ['text/plain']

在我的 ListModel class 中。现在我想我只需要正确地重新实现 dropMimeData,我认为一切都会好起来的。如果我设法做到这一点,我会更新这个 post。

这里有一个解决方案,可以将 QTextEdit 中突出显示的文本拖放到 QListView 中,添加一个包含该文本的新行。子类化 QListView 并重新实现 dragEnterEventdragMoveEventdropEvent。在 dropEvent 中添加带有 QStandardItemModel.appendRow() 的新项目。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class ListView(QListView):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setAcceptDrops(True)
        self.setModel(QStandardItemModel(0, 1))

    def dragEnterEvent(self, event):
        event.accept() if event.mimeData().hasText() else event.ignore()

    def dragMoveEvent(self, event):
        event.accept() if event.mimeData().hasText() else event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasText():
            event.setDropAction(Qt.CopyAction)
            self.model().appendRow(QStandardItem(event.mimeData().text()))
            event.accept()
        else:
            event.ignore()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    hbox = QHBoxLayout(window)
    hbox.addWidget(QTextEdit())
    hbox.addWidget(ListView())
    window.show()
    sys.exit(app.exec_())

结果: