【问题标题】:How do i drag item from QListWidget and drop to QPlainTextEdit?如何将项目从 QListWidget 拖放到 QPlainTextEdit?
【发布时间】:2020-06-01 06:12:21
【问题描述】:

如左图所示,我有一个名为“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】:

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

    【讨论】:

    • 我可以这样做吗void MainWindow::dragEnterEvent(QDragEnterEvent *event) { if (event-&gt;mimeData()-&gt;hasFormat("text/uri-list")) event-&gt;acceptProposedAction(); }
    • 再次您好,拖放工作正常,但由于我将 QListWidget 子类化并使用此代码创建 QListWidget ui->block_commands_listwidget = new ListWidget(ui->centralwidget);我无法实现单击和双击功能。
    • @Mr_Workalot 1) 你不应该做ui-&gt;block_commands_listwidget = new ListWidget(ui-&gt;centralwidget); 而是推广小部件,阅读doc.qt.io/qt-5/designer-using-custom-widgets.html 了解更多信息,以上你应该不再有问题,2) 如果我的回答对你有帮助不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour
    • 非常感谢您的指导,根据您的建议,我所做的是,在我的 Eclipse 中,我添加了一个名为 Header.h 的新 Header 文件,该 Header.h 文件包含 class ListWidget ,然后在我的Qt Designer中我右键单击我想要的QListWidget(block_command_listwidget)并提升它,在类名条目中,我放置了ListWidget和标题名称条目,我放置了Header.h。并且工作正常,非常感谢 QT Master @eyllanesc。
    • 另外,我想在 QListwidget 中显示“暂停命令”,但是在我从 QListWidget 拖动“暂停命令”之后,我希望出现“\n”在我的 QTextedit 中,我该如何实现这一点,到目前为止,我知道我可以使用键值对映射并且我有这个代码 map&lt;string, string&gt; commands; commands["Pause Command"] = "\n&lt;Pause seconds=\"10\" /&gt;"; map&lt;string, string&gt;::iterator it; it = commands.find(item-&gt;text()); return it-&gt;second; 任何方式来调整你之前发布的类并实现这一点,谢谢
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2014-07-20
    • 2011-05-08
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多