Russian Qt Forum

Программирование => С/C++ => Тема начата: xintrea от Октябрь 27, 2010, 13:04



Название: А beginInsertRows() оказывается protected...
Отправлено: xintrea от Октябрь 27, 2010, 13:04
Здравствуйте!


Столкнулся сейчас с такой ситуацией.

Делаю я абстрактную модель данных, унаследованную от QAbstractItemModel. Эту модель я делаю в "два слоя".

Первый слой - это класс с именем TreeModel, унаследованный от QAbstractItemModel. Вот так:

Код:
class TreeModel : public QAbstractItemModel
{
 ...
}

Второй слой - это класс с именем KnowTreeMode, унаследованный от TreeModel. Вот так:

Код:
class KnowTreeModel : public TreeModel
{
 ...
}

В классе TreeModel сосредоточены все переопределяемые функции, которые требуется переопределить для работы с видом, и ничего больше.

В классе KnowTreeModel сосредоточены всякие прочие сложные функции, которые работают с Item-представлением данных, обеспечивают вставку/удаление целых подветок, рекурсивную обработку данных, прочие вещи.

Так вот оказывается, что методы beginInsertRows()/endInsertRow() в QAbstractItemModel являются защищенными (protected), и потому могут вызываться только в TreeModel, а в KnowTreeModel - недоступны.

Для взаимодействия с видом у меня используется KnowTreeModel, и получается, что я не могу воспользоваться методами beginInsertRows()/endInsertRow(). Что делать? Сваливать всё в один класс не хочется. Как разрулить такую ситуацию?


Название: Re: А beginInsertRows() оказывается protected...
Отправлено: Пантер от Октябрь 27, 2010, 13:25
Может ступлю, но что если в TreeModel определить в protected виртуальную функцию beginInsertRows?


Название: Re: А beginInsertRows() оказывается protected...
Отправлено: Авварон от Октябрь 27, 2010, 13:35
Ололол? protected видны во всех наследниках.


Название: Re: А beginInsertRows() оказывается protected...
Отправлено: Пантер от Октябрь 27, 2010, 13:39
Точно. Ступил.


Название: Re: А beginInsertRows() оказывается protected...
Отправлено: xintrea от Октябрь 27, 2010, 13:46
Ололол? protected видны во всех наследниках.

Все, понял свою ошибку. Я напрямую вызывал beginInsertRows() для объекта класса KnowTreeModel. Естественно, такое дело не скомпилируется.