Создать класс, наследуя от QTreeView - PullRequest
0 голосов
/ 11 июля 2011

Я запускаю проект с использованием 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 для выполнения реального рисования?

Я хочу изменить способ его рисования.

1 Ответ

1 голос
/ 11 июля 2011

Я постараюсь охватить как можно больше ваших вопросов. Во всех ваших проблемах важно то, что многое из того, что вы пытаетесь выполнить, должно быть выполнено с помощью модели, а не представления (например, наличие определенных записей жирным шрифтом). Из-за этого вам придется сделать свою собственную модель. Вы можете наследовать QSqlTableModel и изменять вещи по своему желанию. Например, если вы хотите выделить определенные элементы в модели данных, вы можете написать

QVariant MyModel::data(const QModelIndex & index, int role) const
{
    QVariant result = QSqlTableModel::data(index, role);
    // add your own qualifications to the following if statement, checking the row
    // and such
    if(role == Qt::FontRole) {
        QFont font = result.value<QFont>();
        font.setBold(true);
        return font;
    }
    return result;
}

Последнее, что вы написали, было про Q_D. Это только для использования в исходном коде Qt. Если вы реализуете свою собственную функцию рисования, вам не нужно использовать этот макрос.

Я бы очень внимательно прочитал о моделях , вам может понадобиться много всего в документации.

...