Я запускаю проект с использованием Qt. Я пробую два подхода, чтобы получить представление, чтобы сделать некоторые из следующих действий. Этот вопрос включает в себя подход наследования от QTreeView.
Мне нравится то, что делает QTreeView. Мне просто нужны некоторые дополнительные функции.
Во-первых, я хочу создать иерархическое древовидное представление, которое позволит мне видеть категории, содержащие другие категории. Чем дальше вправо столбцы, тем более они конкретны, пока не дойдут до самых конкретных. Метрики показаны в строке, содержащей наиболее конкретный столбец. Строки представления, содержащие каждый обобщенный столбец, будут выделены жирным шрифтом и содержат сводку по каждой метрике, рассчитанную моделью (или представлением?). Метрики будут в модели в каждой строке в терминах наиболее конкретного столбца.
Например, рассмотрим модель со следующими данными (последние 3 столбца содержат числа):
Страна | Провинция-State | уездного приход | Город-место | Население | PerCapitaIncome | Walmarts
Так что мой взгляд будет выглядеть примерно так:
Country Province-State County-Parish City-Town Population PerCapitaIncome Walmarts
+ USA 250000000 42000 2354
+ Alabama 9000000 23000 153
+ Barbour 15324 19032 1
Eufaula 6520 23000 1
+ Tennessee 14000000 29000 299
+ Hamilton 70000 41000 4
East Ridge 23000 32000 2
Во-вторых, мне нужно, чтобы он работал с QSqlTableModel. Я видел, как она показывала модель раньше, но у нее нет никакого способа создать ряды по иерархии, как описано выше. Это будет моя вторая модификация.
Третья причина заключается в том, что полужирные заголовки доступны только в том случае, если сортировка включена с помощью:
view->setSortingEnabled(true);
Когда сортировка включена, полужирные заголовки работают только для верхних строк, а затем выключаются для нижних. Я хочу исправить эту ошибку.
Виртуальный метод QTreeView :: drawRow выглядит как все, что мне нужно переопределить для выполнения первой задачи (и, возможно, третьей). Вторая проблема, связанная с QSqlTableModel, я в этом не уверен.
Во всяком случае, я построил простой класс, унаследованный от QTreeView с универсальным ctor и dtor, который просто вызывает методы QTreeView. Что касается drawRow, я столкнулся со следующей проблемой. Функция QTreeView :: drawRow запускается так:
QTreeView::drawRow(
QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const {
Q_D(const QTreeView);
QStyleOptionViewItemV4 opt = option;
const QPoint offset = d->scrollDelayOffset;
const int y = option.rect.y() + offset.y();
const QModelIndex parent = index.parent();
const QHeaderView *header = d->header;
const QModelIndex current = currentIndex();
const QModelIndex hover = d->hover;
const bool reverse = isRightToLeft();
const QStyle::State state = opt.state;
const bool spanning = d->spanning;
const int left = (spanning ? header->visualIndex(0) : d->leftAndRight.first);
const int right = (spanning ? header->visualIndex(0) : d->leftAndRight.second);
...
Функция полагается на успешное выполнение Q_D (const QTreeView) и возвращает «d», экземпляр класса QTreeViewPrivate, который содержит важную информацию, связанную с компоновкой и оставшейся частью функции. Так как я наследую в своем классе CustomTreeView, CustomTreeViewPrivate нужно будет сначала определить и создать экземпляр, если я хочу запустить Q_D (const QTreeView) в CustomTreeView :: drawRow ().
Действительно ли необходимо создавать этот закрытый класс для наследования и внесения существенных изменений? Какая польза от наследования, если все, что я могу сделать, это некоторые поверхностные процессы, а затем вызвать QTreeView :: drawRow для выполнения реального рисования?
Я хочу изменить способ его рисования.