У меня есть настраиваемая прокси-модель, которая время от времени перестраивается, когда в исходную модель добавляется новый столбец/строка. Из документов видно, что вызов 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
как friend class
в моей унаследованной модели не помогает, так как я пытаюсь взаимодействовать с базовым классом.
Я бы предпочел не делать индивидуальную реализацию для каждой модели, которую я реализую, поэтому могу ли я сделать это с помощью шаблонов? Я еще не очень хорошо знаком с синтаксисом шаблонов.
Правка 1: (во избежание путаницы я удалил пример кода шаблона в редакции 2)
Было бы неплохо, если бы я мог каким-то образом ограничить шаблон, чтобы разрешить только типы, которые наследуют QAbstractItemModel
, но я не вижу ничего в стандартном C++, что позволяет это. Я не буду использовать Boost.
Редактировать 2. Думаю, я не очень четко выразил свои требования. Они здесь:
- Работает с базовым классом для общего случая
- Применяет требование наследования
QAbstractItemModel
в режиме отладки без штрафных санкций в режиме выпуска. - Простое использование практически без накладных расходов
- Не требует модификации базового класса или новых функций
beginResetModel()
иendResetModel()
не являютсяvirtual
в базовой реализации, поэтому я не могу воспользоваться этим. - person Phlucious   schedule 07.03.2013ModelResetter
отQAsbtractItemModel
тоже :D - person fasked   schedule 07.03.2013is-a
идеи наследования? - person Phlucious   schedule 08.03.2013