【发布时间】:2013-03-07 17:10:22
【问题描述】:
我有一个自定义代理模型,当将新列/行添加到其源模型中时,它偶尔会自行检修。从文档看来,在此类操作的开始和结束时调用QAbstractItemModel::beginResetModel() 和QAbstractItemModel::endResetModel() 是正确的方法。不幸的是,我的大修函数有几个可能的退出点,我只知道我会忘记在每个退出点调用endResetModel,因为它变得更加复杂。
因此,我想创建一个简单的 RAII 类,在构造时调用 beginResetModel,然后在销毁时调用 endResetModel,如下所示:
class ModelResetter
{
public:
ModelResetter(QAbstractItemModel* model) : m_model(model)
{
m_model->beginResetModel();
}
~ModelResetter()
{
m_model->endResetModel();
}
private:
QAbstractItemModel* m_model;
};
问题在于beginResetModel() 和endResetModel() 在QAbstractItemModel 中都是protected。在我的 inherited 模型中将 ModelResetter 声明为 friend class 似乎没有帮助,因为我正在尝试与基类进行交互。
我不想为我实现的每个模型都进行自定义实现,那么我可以使用模板来实现吗?我对模板语法还不是很熟悉。
编辑 1:(我删除了编辑 2 中的示例模板代码以避免混淆)
如果我能以某种方式将模板限制为只允许继承 QAbstractItemModel 的类型,那就太好了,但我在标准 C++ 中看不到任何允许这样做的东西。我不会使用 Boost。
编辑 2:我想我并不清楚我的要求。他们在这里:
- 对一般情况的基类进行操作
- 在调试模式下强制执行
QAbstractItemModel继承要求,而在发布模式下不受惩罚 - 使用简单,几乎没有开销
- 不需要修改基类或新函数
【问题讨论】:
-
这与this link的情况基本相反。请注意,
beginResetModel()和endResetModel()在基本实现中不是virtual,所以我无法利用它。 -
也从
QAsbtractItemModel继承ModelResetter:D -
聪明,但这不是几乎违反了
is-a继承概念的所有规则吗? -
也许你可以让你的 ModelResetter 在你的模型中成为一个嵌套类。然后你可以使用受保护的方法
-
我正在考虑这个选项。不过,我更愿意写得更笼统。
标签: c++ qt templates qt4 qabstractitemmodel