gpt4 book ai didi

c++ - 创建 QAbstractModelItem 的代理

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

我正在编写一个 Qt 应用程序来实现非常庞大的数据集的可视化。

所以,我有一个 SourceDataModel 类,继承自 QAbstractItemModel,它似乎工作正常(目前,我只在 QTableView/QTreeView 中显示它,但后来,我'我将创建一些自定义 View )。

现在,我希望能够过滤这些数据,即

  1. 能够拥有不同的数据分辨率(即只曝光 12) 中的数据项

  2. 能够对数据应用一些过滤器(即将 unix 时间戳显示为dd/MM/yyyy hh:mm:ss)

所以我开始创建一个 ProxySourceDataModel 类,它继承 self 的 SourceDataModel 并存储一个实例,基本上将所有内容委托(delegate)给实例。从这个 ProxySourceDataModel 中,我注意到当我在 QTableView 中使用它时没有显示任何数据。经过一些调查,这似乎是因为我必须转发来自底层 SourceDataModel 的信号和插槽。没问题,我做到了。

但仍然存在两个问题,我不知道如何处理它们:

  1. 我无法在 View 中选择数据。如果我直接使用 SourceDataModel,没问题。但是使用 ProxySourceDataModel 我无法选择任何内容。

  2. 数据根本没有被过滤!我在 ProxySourceDataModel 中重载了 data(),并将所有其他调用转发给底层 SourceDataModel。但是,仍然只有 SourceDataModel::data() 被调用。

下面是一些代码来说明我在做什么:

class SourceDataModel : public QAbstractItemModel
{
//...
};

class ProxySourceDataModel : public SourceDataModel
{
public:
ProxySourceDataModel(SourceDataModel& model)
: model_(model)
{
// For all QAbstractItemModel's signals emitted by the underlying model,
// I propagate them like this
QObject::connect( &model_, SIGNAL( the_signal()),
this, SLOT (forward_the_signal())) ;
}

slots:
void forward_the_signal()
{
emit the_signal();
}

public:
// For all QAbstractItemModel's virtual function, I do something like this
virtual void the_function()
{
model_.the_function();
}

// This is where I was hoping to do the filtering
virtual QVariant data( const QModelIndex& index,int role=Qt::DisplayRole )
{
return filter( model_.data(index,role) );
}

private:
SourceDataModel& model_;
};

SourceDataModel sourceDataModel;
QTableView view;
view.setModel( new ProxySourceDataModel(sourceDataModel) );

非常感谢任何帮助或建议,感谢阅读!

-------------------- 编辑 -------------------- -

我找到了!

问题在于 View 不使用其模型中的QAbstractItemModel::data(),而是对其项调用QModelIndex::data(),这依次调用项目底层模型的 QAbstractItemModel::data()。由于我的代理从底层模型返回模型索引,这就是为什么总是调用 SourceDataModel::data() 而不是 ProxySourceDataModel()!

我刚刚重新实现了 ProxySourceDataModel::index() 以返回本地索引,它非常有效。访问In QT, chaining models does not work as expected了解更多信息。

谢谢!

最佳答案

问题在于 View 不使用其模型中的QAbstractItemModel::data(),而是对其项调用QModelIndex::data(),这依次调用项目底层模型的 QAbstractItemModel::data()。由于我的代理从底层模型返回模型索引,这就是为什么总是调用 SourceDataModel::data() 而不是 ProxySourceDataModel()!

我刚刚重新实现了 ProxySourceDataModel::index() 以返回本地索引,它非常有效。访问In QT, chaining models does not work as expected了解更多信息。

关于c++ - 创建 QAbstractModelItem 的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5390649/

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