首页 > 解决方案 > 如何将项目从 QListWidget 拖放到 QPlainTextEdit?

问题描述

Qt

如左侧图像所示,我有一个名为“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,我猜是因为当我拖动时,它是“项目类型”,当我试图放入文本框时,QPlainTextEdit 只接受文本而不接受项目类型。我该怎么做呢 ?感谢您经历这一切。

标签: c++qtqt5qt-creatorqtcore

解决方案


问题很简单: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();
}

推荐阅读