我有一个自定义代理模型,当将新列/行添加到其源模型时,它偶尔会自行检修。从文档看来,在此类操作的开始和结束时调用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()
都protected
在QAbstractItemModel
. 在我的继承模型中声明ModelResetter
为 a似乎没有帮助,因为我正在尝试与基类交互。friend class
我不想为我实现的每个模型都做一个自定义实现,那么我可以用模板来做这个吗?我对模板语法还不是很熟悉。
编辑 1:(我删除了编辑 2 中的示例模板代码以避免混淆)
如果我能以某种方式将模板限制为只允许继承的类型,那就太好了QAbstractItemModel
,但我在标准 C++ 中看不到任何允许这样做的东西。我不会使用 Boost。
编辑 2:我想我并不清楚我的要求。他们来了:
- 对一般情况的基类进行操作
- 在调试模式下强制
QAbstractItemModel
继承要求,而在发布模式下没有惩罚 - 使用简单,几乎没有开销
- 不需要修改基类或新函数