[英]Qt4: Read Default mimeData from QAbstractItemModel
我想做的事情与此非常相似。 除了我正在使用具有树结构的QAbstractItemModel之外,他对行和列的兴趣不止于此。 实际上,在我的模型中,列始终为0。但是,为了实现拖放操作,我需要获取parent,children和internalPointer()返回的不透明指针。 这是一些相关的代码。 CTreeView扩展了QTreeView。
void CTreeView::dragEnterEvent(QDragEnterEvent* event)
{
if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
{
event->acceptProposedAction();
}
}
void CTreeView::dropEvent(QDropEvent* event)
{
const QMimeData* mime_data = event->mimeData();
QByteArray encoded_data =
mime_data->data("application/x-qabstractitemmodeldatalist");
QDataStream stream(&encoded_data, QIODevice::ReadOnly);
while (!stream.atEnd())
{
// I can do this.
int row, column;
stream >> row >> column;
// But how do I construct the QModelIndex to get the parent, children,
// and opaque pointer?
// I have seen other advice that mentions doing this.
QMap<int, QVariant> role_data_map;
stream >> row >> col >> role_data_map;
// Which allows you to do this.
QList<int> keys = role_data_map.keys();
BOOST_FOREACH(int key, keys)
{
QVariant variant = role_data_map[key];
// use the variant
}
// But that only gets me part of the way there.
}
}
有任何想法吗? 我只想在树状视图中支持拖放操作,因此我正在考虑将selectedIndexes()的QModelIndexList存储在子类的成员变量中,然后直接在dropEvent()中对其进行操作。 这似乎有点作弊,所以我仍然对Qt方式感兴趣。 请让我知道您对这个想法的看法。
首先,从代码中看来,您正在以错误的方式执行操作:您不应在视图中重载dropEvent,而应在模型中重载dropMimeData。 以下文档说明了如何使用Qt的模型/视图框架进行操作:
http://doc.trolltech.com/latest/model-view-dnd.html
至于您的特定问题,那就是访问已放置项目的internalPointer()。 将索引存储在类的索引中既危险又容易出错。 您要做的就是将所需的信息存储在mime数据中。 我不知道您的用例是什么,所以我无法猜测这个有用的数据是什么-但是,如果您只需要internalPointer的值(并且可以确保在接收到drop事件时该值仍然有效),则可以只需存储它,即可决定格式。 例如,如果您的数据被某个地方的唯一ID引用(例如数据库中的行ID),则可以存储此信息,并在模型中具有自定义index(int rowid)方法,该方法根据此信息构造QModelIndex。 通常,索引的internalPointer是在创建索引的过程中设置的,因此可以获取所有需要的信息。
如果您告诉我们如何创建索引,也许我们可以提供进一步的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.