C++ 从QAbstractItemModel拖动会删除空字符串
我从C++ 从QAbstractItemModel拖动会删除空字符串,c++,qt,drag-and-drop,C++,Qt,Drag And Drop,我从qabstractemodel派生了一个custem模型,并通过 重载返回Qt::ItemIsDragEnabled的flags()方法(如果适用) 重载supportedDropActions和 实现mimeData()以正确返回QMimeData对象,并为text/plain格式设置一些字符串 当我在QTreeView中设置此模型并通过setDragEnabled(true)启用拖动时,我可以从树视图中拾取项目并拖动它们。例如,我可以拖动一个项目并将其放到QLineEdit上,它将依次显
qabstractemodel
派生了一个custem模型,并通过
Qt::ItemIsDragEnabled
的flags()方法(如果适用)
supportedDropActions
和mimeData()
以正确返回QMimeData
对象,并为text/plain
格式设置一些字符串QTreeView
中设置此模型并通过setDragEnabled(true)
启用拖动时,我可以从树视图中拾取项目并拖动它们。例如,我可以拖动一个项目并将其放到QLineEdit
上,它将依次显示模型通过mimeData()
返回的字符串
但是,当我拖动一个项目并将其放到另一个应用程序的小部件(例如记事本或我的应用程序的第二个实例)上时,会删除一个空字符串
我使用Qt附带的Drop site示例找到了另一条线索:当我将一个项目拖到上面时,它正确地显示有可用的text/plain
,甚至显示与之相关的字符串。然而,当我删除该项时,我在dropEvent()
中再次得到一个空字符串
源代码
ssce.pro:
QT += core gui widgets
TARGET = ssce
TEMPLATE = app
SOURCES += main.cpp
main.cpp:
#include <QtCore>
#include <QtWidgets>
struct Model: public QAbstractItemModel {
int rowCount(const QModelIndex &parent) const {
return parent.isValid() ? 0 : 1;
}
int columnCount(const QModelIndex &parent) const {
return 1;
}
QModelIndex index(int row, int column, const QModelIndex &parent) const {
return parent.isValid() ? QModelIndex() : createIndex(row, column, static_cast<void *>(0));
}
QModelIndex parent(const QModelIndex &child) const {
return QModelIndex();
}
Qt::ItemFlags flags(const QModelIndex &index) const {
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
}
QVariant data(const QModelIndex &index, int role) const {
return (role == Qt::DisplayRole) ? "Test item" : QVariant();
}
QStringList mimeTypes() const {
return QStringList("text/plain");
}
QMimeData *mimeData(const QModelIndexList &indexes) const {
QMimeData *d = new QMimeData();
d->setText("hello world");
return d;
}
Qt::DropActions supportedDropActions() const {
return Qt::CopyAction;
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QDialog d;
QVBoxLayout l;
QLineEdit e;
l.addWidget(&e);
QTreeView v;
Model m;
v.setModel(&m);
v.setDragEnabled(true);
l.addWidget(&v);
d.setLayout(&l);
d.show();
return a.exec();
}
#包括
#包括
结构模型:公共QabstracteModel{
int行计数(常量QModelIndex和父级)常量{
返回parent.isValid()?0:1;
}
int columnCount(常量QModelIndex&parent)常量{
返回1;
}
QModelIndex索引(int行、int列、常量QModelIndex&parent)常量{
返回parent.isValid()?QModelIndex():createIndex(行、列、静态转换(0));
}
QModelIndex父项(常量QModelIndex和子项)常量{
返回QModelIndex();
}
Qt::ItemFlags标志(常量QModelIndex&index)常量{
返回Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
}
QVariant数据(常量QModelIndex和索引,int角色)常量{
return(role==Qt::DisplayRole)?“测试项”:QVariant();
}
QStringList mimeTypes()常量{
返回QStringList(“文本/普通”);
}
QMimeData*mimeData(常量QModelIndexList&index)常量{
QMimeData*d=新的QMimeData();
d->setText(“你好世界”);
返回d;
}
Qt::DropActions supportedDropActions()常量{
返回Qt::CopyAction;
}
};
int main(int argc,char*argv[]){
质量保证申请a(argc、argv);
QDialog d;
qvboxl;
Qlinee;
l、 addWidget&e;
QTreeView v;
模型m;
v、 setModel&m;
v、 setDragEnabled(真);
l、 addWidget&v;
d、 设置布局(&l);
d、 show();
返回a.exec();
}
说明:
运行此命令,您可以将项目从树状视图拖动到行编辑中,然后它将显示hello world。将该项放到其他任何地方,包括示例应用程序第二个实例的行编辑,都不会发生任何事情。我会在问题中至少添加mimeData()重新实现我会在问题中至少添加mimeData()重新实现