我从QAbstractItemModel
派生了一个custem模型,并通过
flags()
方法,该方法在适用的情况下返回Qt::ItemIsDragEnabled
,supportedDropActions
和mimeData()
以正确返回QMimeData
个对象,并为text/plain
格式设置一些字符串。当我在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 。将项目放在其他任何位置,包括示例应用程序的第二个实例的行编辑,什么都不会发生。