gpt4 book ai didi

c++ - Qt 拖放 TreeView : what am I missing

转载 作者:行者123 更新时间:2023-11-30 04:14:42 26 4
gpt4 key购买 nike

我有一个标准 TreeView ,它正在查看 QStandardItemModel 的子类。

模型中的项目也是 QStandardItem 的子类。这些项目有一个额外的对象指针,我用它来存储指向我的数据类实例的指针,一个“阶段”(它本身是一个 QObject)。所有项目都有一个指向它的阶段或子类的指针,或者 _object 中的 NULL 指针。

class MyStandardItem : public QStandardItem
{
public:
MyStandardItem();
MyStandardItem(const QString &text);
MyStandardItem(const QIcon &icon, const QString &text);

~MyStandardItem();
void object(QObject *object) {_object = object;}
QObject *object(){return _object;}
private:
QObject *_object;
};

我想在 TreeView 中四处移动项目,但要遵守一些限制。我已经为 TreeView 提供了正确的策略:

view->setAcceptDrops(true);
view->setDragEnabled(true);
view->setDropIndicatorShown(true);
view->setDragDropMode(QAbstractItemView::InternalMove);

在我的模型中,我提供了以下内容:

Qt::DropActions MyStandardItemModel::supportedDropActions() const
{
return Qt::MoveAction;
}

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;

MyStandardItem *item = dynamic_cast<MyStandardItem*>(itemFromIndex(index));

if(!item || !item->object())
{
return defaultFlags;
}
Stage *stage = dynamic_cast<Stage*>(item->object());
switch (stage->type())
{
case Stage::STAGEA:
return Qt::ItemIsDropEnabled | defaultFlags;
break;
case Stage::STAGEB:
case Stage::STAGEC:

return Qt::ItemIsDragEnabled | defaultFlags;
break;
}
return defaultFlags;
}

拖动行为看起来没问题。但是当我在 TreeView 中点击一个拖动的项目时,所选项目的对象指针是垃圾:

void Project::model_clicked(const QModelIndex& index)
{
MyStandardItem *item = static_cast<MyStandardItem*>(_tree_model->itemFromIndex(index));
if(!item || !item->isValid())
return;
QObject *object = item->object();
if(!object)
return;
// object is junk
Stage *stage = static_cast<Stage*>(object);
// and of course stage is junk
}

我是否需要为我的子类 MyStandardItem 实现 dropMimeData 或类似的特殊东西?因为我只是在移动,所以我希望对象指针完好无损。如果我确实需要实现 dropMimeData,拖动数据的 mimetype 是什么?我知道我可以使用模型选择看到它,但从逻辑上讲我应该能够从 mimedata 中获取数据。非常感谢您的帮助!

最佳答案

好吧,我找到了我自己问题的答案。

通过 Qt 将数据“移动”到模型中的所需位置,然后删除它

这意味着有必要实现一个 clone() 成员以供 dropMimeData 使用(据我所知,它也必须重新实现)

这意味着小部件必须作为指针存储在对象中以允许在树中轻松移动(否则数据必须在小部件之间手动复制,因为 QObjects 没有默认拷贝(按设计)

关于c++ - Qt 拖放 TreeView : what am I missing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18738676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com