新しい列/行がソース モデルに追加されると、それ自体がオーバーホールされるカスタム プロキシ モデルがあります。ドキュメントから、そのような操作の開始時と終了時に QAbstractItemModel ::beginResetModel() とQAbstractItemModel::endResetModel( ) を呼び出すことが適切な方法であるように見えます。endResetModel
残念ながら、私のオーバーホール関数にはいくつかの出口点があり、複雑になるにつれてすべての出口点で呼び出すのを忘れてしまうことがわかっています。
beginResetModel
したがって、次のように、構築を呼び出しendResetModel
てから破棄を呼び出す単純な RAII クラスを作成したいと思います。
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
されたモデルで として宣言しても役に立たないようです。friend class
実装するモデルごとにカスタム実装を行いたくないので、テンプレートでこれを行うことはできますか? 私はまだテンプレートの構文にあまり慣れていません。
編集 1: (混乱を避けるために、編集 2 のサンプル テンプレート コードを削除しました)
を継承する型のみを許可するようにテンプレートを何らかの形で制限できればいいのですが、それを許可するQAbstractItemModel
標準 C++ には何もありません。ブーストは使用しません。
編集 2 : 私は自分の要件について本当に明確ではなかったと思います。どうぞ:
- 一般的なケースの基本クラスで動作します
QAbstractItemModel
リリース モードでのペナルティなしに、デバッグ モードで継承要件を強制します。- オーバーヘッドがほとんどないシンプルな使い方
- 基本クラスや新しい関数の変更は不要