Нужно ли мне реализовать мой собственный QAbstractTableModel? - PullRequest
0 голосов
/ 19 февраля 2012

Я нашел этот вопрос: Как изменить цвет фона для заголовка QTreeView (он же QHeaderView)?

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

Решение говорит: " Самый простой способ сделать это, вероятно, - вывести новую модель из QAbstractItemModel или другого класса модели ипереопределить headerData () ".Я пошел и посмотрел на дерево исходных текстов Qt для QTableWidget, QTableModel, QTableWidgetItem ... эти классы предположительно являются "моделями по умолчанию", поэтому я подумал, что они будут хорошим примером, и тогда я пойду реализовывать свой собственный QAbstractTableModel,

3 файла, которые я видел, - это колоссальные 3300 строк кода.Это определенно НЕ "самый простой способ" IMO !!!

Мне бы хотелось функциональность QTableWidget, но затем я хочу добавить следующую способность:

  • horizontalHeader.setSectionColor (index, цвет)
  • verticalHeader.setSectionColor (индекс, цвет)

Действительно ли мне нужно наследовать / реализовывать QAbstractTableModel, если все, что я хочу, это изменить цвет разделаheader?


Обновление:

Я не использую свой собственный вид и классы моделей.Я использую вспомогательный класс QTableWidget прямо сейчас (он называется вспомогательным классом b / c, он реализует представление и модель).Функция headerData() является частью модели.Класс модели , QTableModel, не доступен через lib / headers Qt, поэтому я не могу наследовать его.


Обновление:

Я попытался создать новый элемент с помощью кисти фона QBrush(QColor(Qt::red)), а затем установить заголовок таблицы с новым элементом (используя QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem *item). Я также попытался наследовать QTableWidgetItem и переопределив виртуальный метод data() с помощью:

QVariant HeaderItem::data(int role) const
{
    if(role==Qt::BackgroundRole) {
        return QVariant(QBrush(QColor(Qt::red)));
    } else if(role==Qt::ForegroundRole) {
        return QVariant(QBrush(QColor(Qt::green)));
    } else {
        return QTableWidgetItem::data(role);
    }
}

Я могу изменить передний план разделов заголовка. Но когда я пытаюсь изменить фоновую кисть заголовка ... ничего не происходит ... это какФоновая кисть QTableWidgetItem, которую я установил для раздела заголовка, игнорируется.

1 Ответ

1 голос
/ 20 февраля 2012

Вместо создания модели с пользовательским headerData () с нуля создайте подкласс QTableWidgetItem с желаемой реализацией QTableWidgetItem :: data () и используйте экземпляры этого класса для QTableWidget :: setHorizontalHeaderItem .

...