PyQt5: Как перетащить текст из QTextEdit в QlistView? - PullRequest
0 голосов
/ 08 апреля 2020

В настоящее время я создаю 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 , в котором у нас есть self.inputs_list.setDragDropMode (QtWidgets.QAbstractItemView.DragDrop) и где определен мой виджет QTextEdit ( self.req_editor )

в переопределенных dropMata Я пытался напечатать материал, просто чтобы посмотреть, как он работает, но ничего не сделал, когда я пытался отбросить свою строку в QListView.

Мне ясно, что я должен реализовать что-то, что добавит строка в ListView по капле строки, и установить новый элемент с текстом из строки, я просто не могу получить, что является отправной точкой.

РЕДАКТИРОВАТЬ : после дальнейшего исследования Мне удалось сделать элемент приемлемым, добавив:

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

в моем классе ListModel. Теперь я думаю, что мне просто нужно правильно переопределить dropMimeData, и я думаю, что все будет хорошо. Я обновлю этот пост, если мне удастся это сделать.

1 Ответ

1 голос
/ 09 апреля 2020

Вот решение для перетаскивания выделенного текста в 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_())

Результат:

enter image description here

...