2010-08-18 88 views
0

我想要做的事與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方式感興趣。請讓我知道你對這個想法的看法。

回答

0

首先,它看起來像你的代碼,你做錯了方式:你不應該在你的視圖中重載dropEvent,而應該在你的模型中使用dropMimeData。下面的文檔解釋瞭如何做使用Qt的模型/視圖框架,DND:

http://doc.trolltech.com/latest/model-view-dnd.html

至於你的具體問題,這是訪問掉落的物品的internalPointer()。將索引存儲在類的索引中是危險且容易出錯的。你想要做的是將你需要的信息存儲在MIME數據中。我不知道你的用例是什麼,所以我不能猜測這些有用的數據是什麼 - 但是如果你只需要internalPointer的值(並且可以確保在收到drop事件時這個值仍然有效),那麼你可以只要存儲它,就像你決定格式一樣。例如,如果數據在某處被某個唯一ID引用(如數據庫中的行ID),則可以存儲此信息並在模型中具有自定義索引(int rowid)方法,該方法根據此信息構造QModelIndex。通常,索引的internalPointer在創建期間被設置,所以這將允許獲取所有需要的信息。

如果您告訴我們如何創建索引,也許我們可以進一步提供幫助。

+0

謝謝你的回答。我已閱讀該文檔,但我的實現仍然不dtrt。也許你是對的,我不需要在內部指針中存儲任何東西。我仍然在研究這個問題,所以我會在我對這個問題進行改進之前看看我能做些什麼。 – 2010-08-20 16:28:00