繁体   English   中英

Qt4:从QAbstractItemModel读取默认的mimeData

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM