我想要做的事與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