【问题标题】:Qt4: QAbstractTableModel Drag and Drop w/o MIMEQt4:QAbstractTableModel 拖放 w/o MIME
【发布时间】:2010-01-26 22:46:08
【问题描述】:

我有一个继承 QAbstractTableModel 的类,并在 QMap 中保存一些复杂的结构。 QVariant data(QModelIndex index, ...) 方法只返回一个枚举,它描述了自定义项委托应如何绘制单元格的内容。我想在这个模型中实现拖放功能,以便用户可以在 QMap 中重新排序这些结构,但不能完全理解 Qt 希望我如何做到这一点。我只需要查看拖放操作的源索引和目标索引,其余的我可以处理,但我在 QAbstractItemModel 中找到的最接近的是dropMimeData() 函数。 DropMimeData() 没有给我源索引,并要求我将数据转换为某种 MIME 类型(明文等),但绝对不是。我可以通过创建一个只包含源索引的 QMimeData 来解决这个问题,但我想真正学习使用 Qt,因为它应该被使用,我觉得我错过了一些东西。有什么想法吗?

只是为了澄清一点,该应用程序是一个动画程序,其行为类似于 Adob​​e Flash。继承 QAbstractTableModel 的类有一个QMap<int, FrameState>(和struct FrameState{QPointF pos; bool visible;})来保存关键帧。这个 QMap 的这种状态是我想要显示并让用户编辑的状态。如果有可见关键帧,我画一个绿色圆圈,如果有一个不可见关键帧,我画一个红色圆圈,如果前一个关键帧可见,我画一条线,如果前一个关键帧不可见,我什么也不画。我希望用户能够拖动关键帧来更改他们的 QMap 键。

谢谢!

【问题讨论】:

    标签: user-interface qt qt4


    【解决方案1】:

    您可以使用视图dragEnterEvent 来获取最初选择的索引:

    void DropTreeView::dragEnterEvent(QDragEnterEvent *event)
    {
        QTreeView::dragEnterEvent(event);
    
        const QItemSelectionModel * sm = selectionModel();
        if (!sm)
            return;
    
        dragStartIndicies = sm->selectedIndexes();
    }
    

    您需要使用 mime-types 进行拖放,但 C++ Qt 提供了一种很好的方法,使用 QDataStream

    QMimeData *YourModel::mimeData( const QModelIndexList &indexes ) const
    {
        QByteArray encodedData;
        QDataStream stream( &encodedData, QIODevice::WriteOnly );
    
        stream << yourQMap /* OR almost any Qt data structure */;
    
        QMimeData *mData = new QMimeData();
        mData->setData( YOUR_MIME_TYPE, encodedData );
    
        return mData;
    }
    

    在接收端,您可以从QDataStream 中取出您的数据结构(即QMap,如果这是您想要使用的):

    QByteArray encodedData = yourMimeData->data( YOUR_MIME_TYPE );
    QDataStream stream( &encodedData, QIODevice::ReadOnly );
    QMap decodedMap;
    stream >> decodedMap;
    

    【讨论】:

    • @Boatzart - 我假设您知道拖放的基础知识,只需要一些细节,如果没有,请进一步询问。
    • 是的,我只是想确保没有更直接的方法,例如 (onDragAndDrop(ModelIndex source, ModelIndex dest))
    • 嗯,看起来可能有更直接的方法。通过 dropMimeData 中的拖放操作检查默认 MIME 数据(如果我没有重载 mimeData() 函数),我看到格式列表包含“application/x-qabstractitemmodeldatalist”。我相信这个默认数据包含一个 QModelIndexList,但我不知道如何读取它。
    • 它可能适合您的需求。查看 qabstractitemmodel.cpp,特别是 QAbstractItemModel::decodeData 函数。 dropMimeDatamimeData 方法也很有指导意义。
    • 太好了,谢谢。我在这里提出了一个简明的问题并举例回答:stackoverflow.com/questions/2151216/…
    猜你喜欢
    • 2010-11-07
    • 2011-01-10
    • 2017-12-18
    • 2011-06-24
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多