我如何从QListWidget中拖动项目,然后放到QPlainTextEdit中?

问题描述 投票:0回答:1

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++ qt qt5 qt-creator qtcore
1个回答
0
投票

问题很简单。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();
}
© www.soinside.com 2019 - 2024. All rights reserved.