Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从QAbstractItemModel拖动会删除空字符串_C++_Qt_Drag And Drop - Fatal编程技术网

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()重新实现