Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew_121 от Март 14, 2008, 18:48



Название: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: andrew_121 от Март 14, 2008, 18:48
День добрый.
Вопрос такой: есть QToolButton, как изменить его цвет ?
Код:
   QToolButton* button;
   ...
   QColor color = QColorDialog::getColor(Qt::black, this);
   button->setColor( color ); // нет такой ф-ции.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: pastor от Март 14, 2008, 19:27
см. setPalette


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: vfilatov от Апрель 21, 2008, 22:53
У меня есть QToolBar, на нём QToolButton-ы. Хочу поменять цвет фона у них. Делаю это через setPalette. Всё прекрасно меняется. Но вот когда наводишь на QToolButton мышкой, он рисуется приподнятым и при этом цвет фона становится стандартным серым. Как не танцевал с бубном вокруг setPalette, победить это не смог. Может кто подскажет?


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: pastor от Апрель 21, 2008, 23:50
Покажите код как вы устанавливаете цвет


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: vfilatov от Апрель 22, 2008, 08:01
Ну, последнее моё извращение выглядит примерно так:

Код:
	const QColor c(255, 0, 0);

QPalette p = _ui.toolbar->palette();
       
        // Устанавливаю ВСЕ цвета для ВСЕХ ролей в красный для тулбара
p.setColor(QPalette::Light,           c);
p.setColor(QPalette::Midlight,        c);
p.setColor(QPalette::Dark,            c);
p.setColor(QPalette::Mid,             c);
p.setColor(QPalette::Shadow,          c);
p.setColor(QPalette::Highlight,       c);
p.setColor(QPalette::HighlightedText, c);
p.setColor(QPalette::Link,            c);
p.setColor(QPalette::LinkVisited,     c);
p.setColor(QPalette::Window,          c);
p.setColor(QPalette::Background,      c);
p.setColor(QPalette::WindowText,      c);
p.setColor(QPalette::Foreground,      c);
p.setColor(QPalette::AlternateBase,   c);
p.setColor(QPalette::Text,            c);
p.setColor(QPalette::Button,          c);
p.setColor(QPalette::ButtonText,      c);
p.setColor(QPalette::BrightText,      c);

_ui.toolbar->setPalette(p);


QToolButton* tb = new QToolButton();
tb->setDefaultAction(_action_players);

QPalette pp = tb->palette();

        // Устанавливаю ВСЕ цвета для ВСЕХ ролей в красный для тулбаттона
pp.setColor(QPalette::Light,           c);
pp.setColor(QPalette::Midlight,        c);
pp.setColor(QPalette::Dark,            c);
pp.setColor(QPalette::Mid,             c);
pp.setColor(QPalette::Shadow,          c);
pp.setColor(QPalette::Highlight,       c);
pp.setColor(QPalette::HighlightedText, c);
pp.setColor(QPalette::Link,            c);
pp.setColor(QPalette::LinkVisited,     c);
pp.setColor(QPalette::Window,          c);
pp.setColor(QPalette::Background,      c);
pp.setColor(QPalette::WindowText,      c);
pp.setColor(QPalette::Foreground,      c);
pp.setColor(QPalette::AlternateBase,   c);
pp.setColor(QPalette::Text,            c);
pp.setColor(QPalette::Button,          c);
pp.setColor(QPalette::ButtonText,      c);

tb->setPalette(pp);

_ui.toolbar->addWidget(tb);


В итоге ВСЁ красное... кроме фона при наведении мыши, он по-прежнему серый. Игрался с setAutoFillBackground, тоже не помогло.

Да, версия Qt 4.3.3, WinXP.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: Sergeich от Апрель 22, 2008, 10:49
Попробуй через setStyleSheet:
Цитировать
For this kind of customization, style sheets are much more powerful than QPalette. For example, it might be tempting to set the QPalette::Button role to red for a QPushButton to obtain a red push button. However, this wasn't guaranteed to work for all styles, because style authors are restricted by the different platforms' guidelines and (on Windows XP and Mac OS X) by the native theme engine.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: vfilatov от Апрель 22, 2008, 13:21
Эх, пытаюсь...
Код:
toolbar->setStyleSheet("QToolBar {background: red; }");
Тулбар красный, всё нормально. И фон тулбаттонов, добавляемых на него тоже, т.е. на них этот стиль так же влияет, что логично. Но так же было и с setPalette, а при наведении мышкой то же самое - фон серый. Прежде всего, у какого класса дальше править стили, тулбара или тулбаттонов? Ну раз мышку мы наводим на тулбаттоны, пробую у них
Код:
toolbutton->setStyleSheet("QToolButton { background-color: red; }");
Ничего не меняется. И правильно, потому что в доке написано, что для тулбаттона background-color не работает если не установишь свойство border. Устанавливаю это свойство:
Код:
toolbutton->setStyleSheet("QToolButton { background-color: red; border: 1px solid red; }");
Но теперь при наведении мышкой на тулбаттон он не рисуется приподнятым, как раньше, это не годится. Установка этого свойства сбрасывает autoRaise? Мне его восстановить не удалось.
Есть такой псевдостиль: hover. Вроде как раз это нужно. Пробую:
Код:
toolbutton->setStyleSheet("QToolButton:hover { background-color: red; }");
А всё равно фон серый принаведении мышкой.

Как-то обидно, можно день потратить на эксперименты, а вещь-то элементарная и ясно ведь, что все эти изменения бэкграунда тулбара не имеют никакого смысла, если тулбаттоны на нём ведут себя подобным образом.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: Mikhail от Апрель 22, 2008, 22:24
Ну, последнее моё извращение выглядит примерно так:

Код:
	const QColor c(255, 0, 0);

QPalette p = _ui.toolbar->palette();
       
        // Устанавливаю ВСЕ цвета для ВСЕХ ролей в красный для тулбара
p.setColor(QPalette::Light,           c);
p.setColor(QPalette::Midlight,        c);
p.setColor(QPalette::Dark,            c);
p.setColor(QPalette::Mid,             c);
p.setColor(QPalette::Shadow,          c);
p.setColor(QPalette::Highlight,       c);
p.setColor(QPalette::HighlightedText, c);
p.setColor(QPalette::Link,            c);
p.setColor(QPalette::LinkVisited,     c);
p.setColor(QPalette::Window,          c);
p.setColor(QPalette::Background,      c);
p.setColor(QPalette::WindowText,      c);
p.setColor(QPalette::Foreground,      c);
p.setColor(QPalette::AlternateBase,   c);
p.setColor(QPalette::Text,            c);
p.setColor(QPalette::Button,          c);
p.setColor(QPalette::ButtonText,      c);
p.setColor(QPalette::BrightText,      c);

_ui.toolbar->setPalette(p);


QToolButton* tb = new QToolButton();
tb->setDefaultAction(_action_players);

QPalette pp = tb->palette();

        // Устанавливаю ВСЕ цвета для ВСЕХ ролей в красный для тулбаттона
pp.setColor(QPalette::Light,           c);
pp.setColor(QPalette::Midlight,        c);
pp.setColor(QPalette::Dark,            c);
pp.setColor(QPalette::Mid,             c);
pp.setColor(QPalette::Shadow,          c);
pp.setColor(QPalette::Highlight,       c);
pp.setColor(QPalette::HighlightedText, c);
pp.setColor(QPalette::Link,            c);
pp.setColor(QPalette::LinkVisited,     c);
pp.setColor(QPalette::Window,          c);
pp.setColor(QPalette::Background,      c);
pp.setColor(QPalette::WindowText,      c);
pp.setColor(QPalette::Foreground,      c);
pp.setColor(QPalette::AlternateBase,   c);
pp.setColor(QPalette::Text,            c);
pp.setColor(QPalette::Button,          c);
pp.setColor(QPalette::ButtonText,      c);

tb->setPalette(pp);

_ui.toolbar->addWidget(tb);


В итоге ВСЁ красное... кроме фона при наведении мыши, он по-прежнему серый. Игрался с setAutoFillBackground, тоже не помогло.

Да, версия Qt 4.3.3, WinXP.

Я бы посоветовал посмотреть в сторону QPalette::ColorRole.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: vfilatov от Апрель 22, 2008, 22:33
Хм, не очень понял. Ведь всякие константы QPalette::Window, QPalette::Background и т.д. - это и есть элементы перечисления QPalette::ColorRole. В примере выше я их все ставил в красный цвет. Но на цвет при наведении мыши это не влияло.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: Alex03 от Апрель 23, 2008, 09:18
После setPalette у  меня работает ещё белее по другому...
А самое смешное что туллбар прилепленный к окну отрисовывается по другому чем плавающий.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: Alex03 от Апрель 23, 2008, 09:39
Добавил одну строчку в C:\qt\4.3.3\examples\mainwindows\application\mainwindow.cpp
Код:
void MainWindow::createToolBars()
{
    ...
    fileToolBar->setPalette(QPalette(Qt::red));
}
когда тулбар плавает - то всё как надо, т.е. красный тулбар и красные кнопки всегда.
А вот когда тулбар прилеплен, то поведение наоборот чем у vfilatov, т.е. фон изначально серый, а при наведении мыши красный.
WinXP, Qt 4.3.3. в свойствах экрана винды установлен "Классический стиль" а не "Стиль WinXP".



Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: vfilatov от Апрель 23, 2008, 10:25
Очень интересно! Вы правы, стоит только добавить в своё приложение строку
Код:
QApplication::setStyle("windows");
как всё начинает работать правильно, причём у меня это не зависит от того, прилеплен тулбар или нет.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: Alex03 от Апрель 23, 2008, 11:26
А вообще троли несколько перемудрили скрещивая палитру, стили Qt и стили системы и системных примитивов.
точнее не мудрить тут невозможно.


Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: Mikhail от Апрель 23, 2008, 14:02


Я бы посоветовал посмотреть в сторону QPalette::ColorRole.

Имеется в виду QPalette::ColorGroup и QPalette::ColorRole

Пример

   QPalette pal;
   pal.setBrush ( QPalette::Inactive, QPalette::Highlight, QBrush(Qt::darkBlue) );
pal.setBrush ( QPalette::Active, QPalette::Highlight, QBrush(Qt::red) );
   pal.setBrush ( QPalette::Inactive, QPalette::HighlightedText, QBrush(Qt::white) );




Название: Re: Как изменить цвет QToolButton ? Как изменить цвет QToolButton
Отправлено: vfilatov от Апрель 23, 2008, 14:16
Дело в том, что QPalette::setColor (ColorRole role, const QColor & color)  (без указания ColorGroup)  устанавливает указанную кисть (конструируемую из color) для всех групп, так что в примере выше я устанавливал цвет для всех ролей всех групп.