- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 Qt 应用程序来实现非常庞大的数据集的可视化。
所以,我有一个 SourceDataModel
类,继承自 QAbstractItemModel
,它似乎工作正常(目前,我只在 QTableView/QTreeView 中显示它,但后来,我'我将创建一些自定义 View )。
现在,我希望能够过滤这些数据,即
能够拥有不同的数据分辨率(即只曝光 12) 中的数据项
能够对数据应用一些过滤器(即将 unix 时间戳显示为dd/MM/yyyy hh:mm:ss)
所以我开始创建一个 ProxySourceDataModel
类,它继承 self 的 SourceDataModel
并存储一个实例,基本上将所有内容委托(delegate)给实例。从这个 ProxySourceDataModel
中,我注意到当我在 QTableView
中使用它时没有显示任何数据。经过一些调查,这似乎是因为我必须转发来自底层 SourceDataModel
的信号和插槽。没问题,我做到了。
但仍然存在两个问题,我不知道如何处理它们:
我无法在 View 中选择数据。如果我直接使用 SourceDataModel
,没问题。但是使用 ProxySourceDataModel
我无法选择任何内容。
数据根本没有被过滤!我在 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/
我正在编写一个 Qt 应用程序来实现非常庞大的数据集的可视化。 所以,我有一个 SourceDataModel 类,继承自 QAbstractItemModel,它似乎工作正常(目前,我只在 QTab
我是一名优秀的程序员,十分优秀!