我如何将项目从 QListWidget 拖放到 QPlainTextEdit?

How do i drag item from QListWidget and drop to QPlainTextEdit?

如左图所示,我有一个名为 "my_listwidget" 的 QListWidget,其中填充了 3 个命令,而在右侧,我有一个名为 "my_textedit".

的 QPlainTextEdit

我可以使用此代码从 QListWidget 中拖动

ui->block_commands_listwidget->setSelectionMode(QAbstractItemView::SingleSelection);
ui->block_commands_listwidget->setDragEnabled(true);
ui->block_commands_listwidget ->setDragDropMode(QAbstractItemView::DragDrop);
ui->block_commands_listwidget->viewport()->setAcceptDrops(false);
ui->block_commands_listwidget->setDropIndicatorShown(true);

但是我无法放入我的 QPlainTextEdit,我猜是因为当我拖动时,它的 "item type" 并且当我试图放入文本框时,QPlainTextEdit 只接受文本而不接受项目类型。 我该怎么做呢 ? 感谢您完成此过程。

问题很简单:QPlaintTextEdit默认不识别QListWidget发送的mimetype,所以解决方法是重写mimeData()方法将选中项的文本添加为​​纯文本:

#include <QtWidgets>

class ListWidget: public QListWidget{
public:
    using QListWidget::QListWidget;
protected:
    QMimeData *mimeData(const QList<QListWidgetItem *> items) const
    {
        QMimeData *md = QListWidget::mimeData(items);
        QStringList texts;
        for(QListWidgetItem *item : selectedItems())
            texts << item->text();
        md->setText(texts.join(QStringLiteral("\n")));
        return md;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    ListWidget *lw = new ListWidget;
    lw->addItems({"First Command", "Second Command", "Third Command"});
    lw->setSelectionMode(QAbstractItemView::SingleSelection);
    lw->setDragEnabled(true);
    lw->setDragDropMode(QAbstractItemView::DragOnly);
    QPlainTextEdit *pe = new QPlainTextEdit;
    QHBoxLayout *lay = new QHBoxLayout(&w);
    lay->addWidget(lw);
    lay->addWidget(pe);
    w.show();
    return a.exec();
}