簡體   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