从QAbstractItemModel拖动会删除空字符串

时间:2015-07-26 17:37:33

标签: c++ qt drag-and-drop

我从QAbstractItemModel派生了一个custem模型,并通过

实现了拖放支持
  1. 重载flags()方法,该方法在适用的情况下返回Qt::ItemIsDragEnabled
  2. 重载supportedDropActions
  3. 实施mimeData()以正确返回QMimeData个对象,并为text/plain格式设置一些字符串。
  4. 当我在QTreeView中设置此模型并启用setDragEnabled(true)拖动时,我可以从树状视图中选择项目并拖动它们。例如,我可以拖动一个项目并将其放到QLineEdit上,然后mimeData()将显示模型通过text/plain返回的字符串。

    但是,当我拖动一个项目并将其拖放到另一个应用程序的小部件(例如记事本或我的应用程序的第二个实例)时,空字符串将被删除。

    我发现了使用Qt附带的 Drop网站示例的另一条线索:当我将项目拖到它上面时,它正确地显示有dropEvent()可用,它甚至显示相关的字符串用它。然而,当我放下项目时,我在QT += core gui widgets TARGET = ssce TEMPLATE = app SOURCES += main.cpp ...

    中再次得到一个空字符串

    源码

    ssce.pro:

    #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();
    }
    

    main.cpp中:

    $('#addScnt').live('click', function() {
    

    描述: 运行此选项,您可以将项目从树视图拖动到行编辑中,然后它将显示 hello world 。将项目放在其他任何位置,包括示例应用程序的第二个实例的行编辑,什么都不会发生。

0 个答案:

没有答案