crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableView: Как задать цвет фона для одной секции заголовка?
Steklova Olga
  опции профиля:
сообщение 12.3.2013, 13:34
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Здравствуйте :)
Чтобы задать одинаковый цвет фона для всех секций заголовка делаю так:
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
  опции профиля:
сообщение 12.3.2013, 13:53
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Можно переопределить в модели 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
  опции профиля:
сообщение 12.3.2013, 15:44
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


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
  опции профиля:
сообщение 12.3.2013, 16:35
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


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

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

https://bugreports.qt-project.org/browse/QTBUG-2474
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 12.3.2013, 16:43
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Это проблема дефолтного стиля.
Например если сделать так
view->verticalHeader ()->setStyle (new QMotifStyle);

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

Не очень спортивно конечно, зато дешево и сердито :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 12.3.2013, 16:48
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(RazrFalcon @ 12.3.2013, 17:35) *
Если верить гуглу - то это не возможно...


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


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

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

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

QMotifStyle вряд ли спасет, если приложение использует другой стиль. Будет коряво выглядеть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 12.3.2013, 16:54
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Будет коряво выглядеть.

Норм! :lol:

И потом - выбор невелик. Либо делать свой стиль под все приложение, либо свой paintEvent, который будет все равно корявый, так как оторван от всех стилей.
EDIT: Либо перегрузить какой нибудь один стиль, чтобы он правильно рисовал хедеры и использовать только его.

Сообщение отредактировал lanz - 12.3.2013, 16:58
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 12.3.2013, 17:25
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


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

А вот QMotifStyle только для заголовков таблиц очень даже сойдет :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 0:50