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 并重新实现 dragEnterEvent
、dragMoveEvent
和 dropEvent
。在 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_())
结果:
我目前正在构建一个 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 并重新实现 dragEnterEvent
、dragMoveEvent
和 dropEvent
。在 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_())
结果: