Russian Qt Forum
Ноябрь 23, 2024, 23:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как изменить цвет QToolButton ? Как изменить цвет QToolButton  (Прочитано 14654 раз)
andrew_121
Гость
« : Март 14, 2008, 18:48 »

День добрый.
Вопрос такой: есть QToolButton, как изменить его цвет ?
Код:
   QToolButton* button;
   ...
   QColor color = QColorDialog::getColor(Qt::black, this);
   button->setColor( color ); // нет такой ф-ции.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Март 14, 2008, 19:27 »

см. setPalette
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vfilatov
Гость
« Ответ #2 : Апрель 21, 2008, 22:53 »

У меня есть QToolBar, на нём QToolButton-ы. Хочу поменять цвет фона у них. Делаю это через setPalette. Всё прекрасно меняется. Но вот когда наводишь на QToolButton мышкой, он рисуется приподнятым и при этом цвет фона становится стандартным серым. Как не танцевал с бубном вокруг setPalette, победить это не смог. Может кто подскажет?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Апрель 21, 2008, 23:50 »

Покажите код как вы устанавливаете цвет
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vfilatov
Гость
« Ответ #4 : Апрель 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.
« Последнее редактирование: Апрель 22, 2008, 08:08 от vfilatov » Записан
Sergeich
Гость
« Ответ #5 : Апрель 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.
Записан
vfilatov
Гость
« Ответ #6 : Апрель 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; }");
А всё равно фон серый принаведении мышкой.

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

Сообщений: 587


Просмотр профиля
« Ответ #7 : Апрель 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.
Записан
vfilatov
Гость
« Ответ #8 : Апрель 22, 2008, 22:33 »

Хм, не очень понял. Ведь всякие константы QPalette::Window, QPalette::Background и т.д. - это и есть элементы перечисления QPalette::ColorRole. В примере выше я их все ставил в красный цвет. Но на цвет при наведении мыши это не влияло.
Записан
Alex03
Гость
« Ответ #9 : Апрель 23, 2008, 09:18 »

После setPalette у  меня работает ещё белее по другому...
А самое смешное что туллбар прилепленный к окну отрисовывается по другому чем плавающий.
Записан
Alex03
Гость
« Ответ #10 : Апрель 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".

Записан
vfilatov
Гость
« Ответ #11 : Апрель 23, 2008, 10:25 »

Очень интересно! Вы правы, стоит только добавить в своё приложение строку
Код:
QApplication::setStyle("windows");
как всё начинает работать правильно, причём у меня это не зависит от того, прилеплен тулбар или нет.
Записан
Alex03
Гость
« Ответ #12 : Апрель 23, 2008, 11:26 »

А вообще троли несколько перемудрили скрещивая палитру, стили Qt и стили системы и системных примитивов.
точнее не мудрить тут невозможно.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #13 : Апрель 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) );


Записан
vfilatov
Гость
« Ответ #14 : Апрель 23, 2008, 14:16 »

Дело в том, что QPalette::setColor (ColorRole role, const QColor & color)  (без указания ColorGroup)  устанавливает указанную кисть (конструируемую из color) для всех групп, так что в примере выше я устанавливал цвет для всех ролей всех групп.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.