我想要做的事与this非常相似。除了我正在使用具有树结构并且不仅仅是行和列感兴趣的QAbstractItemModel。实际上,在我的模型中,列始终是0.但是为了实现拖放操作,我需要获取父级,子级和internalPointer()返回的不透明指针。这里有一些相关的代码。 CTreeView扩展了QTreeView。Qt4:从QAbstractItemModel读取默认mimeData
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方式感兴趣。请让我知道你对这个想法的看法。
谢谢你的回答。我已阅读该文档,但我的实现仍然不dtrt。也许你是对的,我不需要在内部指针中存储任何东西。我仍然在研究这个问题,所以我会在我对这个问题进行改进之前看看我能做些什么。 – 2010-08-20 16:28:00