c++ - 如何将项目从 QListWidget 拖放到 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,我猜是因为当我拖动时,它是“项目类型”,当我试图放入文本框时,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();
}
推荐阅读
- flutter - 按下按钮时如何添加自定义小部件
- javascript - Javascript提示只读取输入数字的第一位
- amazon-web-services - 提取 AWS S3 存储桶中特定文件夹内的链接
- cakephp - 没有浏览器刷新,cakephp 页面不会更新
- javascript - 如何在旧文本上方添加新文本时使旧文本向下滑动?
- windows - :ms-properties 备用数据流的内容是什么?
- shell - 使用shell脚本设置环境变量时如何删除回车?
- python - 在数据透视表 pandas 中用 0 填充列
- scala - 可以在 scala 宏中加载应用程序配置吗?
- javascript - 通过索引选择数组中的项目,同时使用 React 钩子