Я довольно новичок в Qt и пытаюсь понять, как мне строить свои модели. Вот ситуация (я полностью владею всем).
У меня есть класс данных, который выглядит примерно так:
class Data
{
public:
Data();
void addValue(int newValue);
void removeValue(int indexToRemove);
// Other access functions
private:
void recalculate();
QList<int> values;
int aggregatedValue;
};
Функции publi c добавляют или удаляют значения из QList
и вызов приватной функции, которая пересчитывает агрегированное значение (в противном случае недоступное), которое является статистическим индексом списка - думайте о нем как о среднем значении списка.
Теперь мне нужно построить модели чтобы показать эти данные.
Вопрос 1 : хорошая ли идея построить модель большого дерева с одной ветвью, содержащей список, а другой - с агрегированным значением? Я попытался немного, но не смог легко построить его так, чтобы имел фиксированную глубину и фиксированное количество дочерних элементов в определенной ветви . В такой большой модели функция setData
будет излучать сигналы, чтобы уведомить представления о том, что изменился не только список, но и агрегированное значение.
Будучи неспособным заставить работать модель дерева, я построил две различные модели, listModel
и aggregatedModel
, причем последняя является моделью только для чтения. Проблема в том, как заставить принудительно обновить виджет, используя aggregatedModel
, когда в список вставляется новое значение?
Я предложил 2 решения: создать супер модель, которая отвечает за подключение listModel
и aggregatedModel
, то есть класс, который перехватывает сигналы dataChanged()
от listModel
, вызывает recalculate()
, а затем излучает сигналы dataChanged()
от aggregatedModel
, чтобы принудительно обновить представления; или сделать Data
класс QObject
, чтобы иметь возможность отправлять сигнал при изменении агрегированного значения (внутри recalculate()
) и подключать aggregatedModel
к нему.
Вопрос 2 : какое решение наиболее распространено? Мне нравится идея иметь фактический класс данных как чистый класс C ++, то есть не QObject
, поэтому никаких накладных расходов, гораздо более переносимый через проекты - но последнее решение кажется более гибким и простым в организации, с дополнительным преимуществом, которое если я использую разные модели для отображения / редактирования одной и той же информации, я могу легко это сделать.
Вопрос 3 : предположим, у меня есть второй класс данных, PooledData
, который объединяет определенные значения из многих Data
объектов. Он содержит указатели на объединенные данные (фактические данные - это не просто целые числа, а более сложные структуры). Кроме того, я должен построить модель, которая реагирует на изменения данных, на которые указывают. Как я могу это сделать?