我有一个继承 QAbstractTableModel 的类,并在 QMap 中保存一些复杂的结构。这QVariant data(QModelIndex index, ...)
方法只返回一个枚举,它描述自定义项目委托应如何绘制单元格的内容。我想在这个模型中实现拖放功能,以便用户可以在 QMap 中重新排序这些结构,但不太清楚 Qt 希望我如何做到这一点。我所需要的只是查看拖/放操作的源索引和目标索引,我可以处理其余的事情,但我在 QAbstractItemModel 中找到的最接近的东西是dropMimeData() http://qt.nokia.com/doc/4.3/qabstractitemmodel.html#dropMimeData功能。 DropMimeData() 不会给我源索引,并要求我将数据转换为某种 MIME 类型(纯文本等),但事实并非如此。我可以通过创建一个仅包含源索引的 QMimeData 来破解这个问题,但我想真正学习使用 Qt,因为它应该被使用,而且我觉得我错过了一些东西。有什么想法吗?
为了帮助澄清一点,该应用程序是一个动画程序,其行为有点像 Adobe Flash。继承 QAbstractTableModel 的类有一个QMap<int, FrameState>
(with struct FrameState{QPointF pos; bool visible;}
)来保存关键帧。这个 QMap 的这种状态就是我想要显示并让用户编辑的状态。如果有可见关键帧,则绘制一个绿色圆圈;如果有不可见关键帧,则绘制红色圆圈;如果前一个关键帧可见,则绘制一条线;如果前一个关键帧不可见,则不绘制任何内容。我希望用户能够拖动关键帧来更改他们的 QMap 键。
Thanks!
您可以使用视图dragEnterEvent
获取最初选择的索引:
void DropTreeView::dragEnterEvent(QDragEnterEvent *event)
{
QTreeView::dragEnterEvent(event);
const QItemSelectionModel * sm = selectionModel();
if (!sm)
return;
dragStartIndicies = sm->selectedIndexes();
}
您需要使用 mime 类型进行拖放,但 C++ Qt 提供了一种很好的方法来做到这一点QDataStream http://doc.trolltech.com/4.6/qdatastream.html:
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;
}
在接收端,您可以获得数据结构(即QMap
如果那是你想使用的)退出QDataStream
:
QByteArray encodedData = yourMimeData->data( YOUR_MIME_TYPE );
QDataStream stream( &encodedData, QIODevice::ReadOnly );
QMap decodedMap;
stream >> decodedMap;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)