Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTableView: Как задать цвет фона для одной секции заголовка?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Steklova Olga
Здравствуйте :)
Чтобы задать одинаковый цвет фона для всех секций заголовка делаю так:
myModel = new QSqlTableModel(this);
myModel->setTable("T1");

myView = new QTableView();
myView->setModel(myModel);
myView->verticalHeader()->hide();

myView->setStyleSheet("QHeaderView::section { background-color:green }");

Подскажите, пожалуйста, как задать для n-й секции заголовка один цвет, а для остальных - другой?
lanz
Можно переопределить в модели headerData, чтобы он в ответ на Qt::BackgroundRole, возвращал нужный QBrush.
Например:
class CustomModel : public QSqlTableModel {
    public:
        virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const {            
            if (role == Qt::BackgroundRole) {
                QVariant value;
                if (section == 42)
                    value.setValue (QBrush(Qt::blue));
                else
                    value.setValue (QBrush(Qt::red));
                return value;
            };
            return QSqlTableModel::headerData (section, orientation, role);
        };
};
Steklova Olga
lanz, у меня не работает то, что вы предлагаете... Вот мой код.
#ifndef MYMODEL_H
#define MYMODEL_H

#include <QSqlTableModel>

class MyModel : public QSqlTableModel
{
    Q_OBJECT
public:
    MyModel(QObject *parent = 0);
    QVariant data(const QModelIndex &index,
                  int role = Qt::DisplayRole) const;
    QVariant headerData(int section,
                        Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const;
};

#endif // MYMODEL_H


#include <QtSql>
#include "mymodel.h"

MyModel::MyModel(QObject *parent) :
    QSqlTableModel(parent)
{
}

QVariant MyModel::data(
        const QModelIndex &index, int role) const
{
    QVariant value = QSqlTableModel::data(index, role);
    switch (role) {
    case Qt::BackgroundRole:
        if (index.column() == 3)
            return QBrush(Qt::green); //ЭТО РАБОТАЕТ
        else
            return value;
    }
    return value;
}

QVariant MyModel::headerData(
        int section, Qt::Orientation orientation, int role) const
{
    QVariant value = QSqlTableModel::headerData(section, orientation, role);
    switch (role) {
    case Qt::BackgroundRole:
        if (section == 2)
            return QBrush(Qt::green); //А ЭТО НЕ РАБОТАЕТ
        else
            return value;
    }
    return value;
}

RazrFalcon
Если верить гуглу - то это не возможно.
Даже тут уже бы подобный вопрос: http://www.forum.crossplatform.ru/index.php?showtopic=5440

Разве что попробовать еще переписать paintEvent у QHeaderView.

https://bugreports.qt-project.org/browse/QTBUG-2474
lanz
Это проблема дефолтного стиля.
Например если сделать так
view->verticalHeader ()->setStyle (new QMotifStyle);

то все в порядке.

Не очень спортивно конечно, зато дешево и сердито :lol:
wiz29
Цитата(RazrFalcon @ 12.3.2013, 17:35) *
Если верить гуглу - то это не возможно...


Судя по исходникам версии 4.8.4, вы абсолютно правы. Без переопределения функции рисования, этого не добиться со стандартными представлениями.


Цитата(lanz @ 12.3.2013, 17:43) *
Это проблема дефолтного стиля.
Например если сделать так
view->verticalHeader ()->setStyle (new QMotifStyle);

то все в порядке.

Не очень спортивно конечно, зато дешево и сердито :lol:

QMotifStyle вряд ли спасет, если приложение использует другой стиль. Будет коряво выглядеть.
lanz
Цитата
Будет коряво выглядеть.

Норм! :lol:

И потом - выбор невелик. Либо делать свой стиль под все приложение, либо свой paintEvent, который будет все равно корявый, так как оторван от всех стилей.
EDIT: Либо перегрузить какой нибудь один стиль, чтобы он правильно рисовал хедеры и использовать только его.
Steklova Olga
Цитата(lanz @ 12.3.2013, 16:54) *
Либо делать свой стиль под все приложение,
либо свой paintEvent,
либо перегрузить какой нибудь один стиль, чтобы он правильно рисовал хедеры, и использовать только его.
Честно скажу, я не умею это делать.

А вот QMotifStyle только для заголовков таблиц очень даже сойдет :D
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.