2010-08-18 31 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