Шаг 110.
Библиотека Qt.
Цветовая палитра элементов управления

    На этом шаге рассмотрим цветовую палитру элементов управления.

    Цветовая палитра элементов управления — это таблица, в которой содержатся цвета, используемые виджетом при отображении на экране. Дело в том, что цвета виджетов не определены окончательно и в любой момент могут быть изменены передачей соответствующего цвета текста, цвета фона и т. д.

    Каждый из виджетов содержит в себе объект палитры, доступ к которому можно получить с помощью метода palette() класса QWidget. Сама палитра — это класс QPalette, который состоит из трех основных групп объектов, показанных на рис. 1.


Рис.1. Схема цветовой палитры виджета

    Эти группы определяют три возможных состояния виджета: активное (Active), неактивное (Inactive) и недоступное (Disabled). Каждая из этих групп состоит из различных цветовых ролей (color roles), описание которых приведено в табл. 1. Каждая роль имеет кисть (QBrush) и цвет (QColor).

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

Таблица 1. Цветовые перечисления ColorRole класса QPalette
Флаг
Описание
WindowText
Цвет, который используется по умолчанию для рисования пером. Этот цвет находится на переднем плане. По умолчанию это черный цвет
Text
Цвет текста. По умолчанию — черный
BrightText
Яркий цвет текста, отличающийся от цвета WindowText. Обычно совпадает с Text. По умолчанию — черный
ButtonText
Цвет текста для надписей на кнопках. По умолчанию — черный
Highlight
Цвет фона выделения элементов. По умолчанию — темно-голубой
HighlightedText
Цвет текста выделенных элементов. Представляет собой контраст к цвету, заданному значением Hightlight. По умолчанию — белый
Window
Основной цвет фона. По умолчанию — светло-серый цвет
Base
Цвет для заднего фона виджета. По умолчанию — белый или другой цвет светлого оттенка
Button
Цвет кнопки, как правило, одного цвета с фоном. По умолчанию — светло-серый
Link
Цвет, используемый для непосещенной гипертекстовой ссылки. По умолчанию — голубой
LinkVisited
Цвет, используемый для обозначения посещенной гипертекстовой ссылки. По умолчанию — розовый
Light
Цвет эффекта объемности. Должен быть светлее цвета заданного значением Button. По умолчанию — белый
Midlight
Цвет эффекта объемности. По умолчанию — светло-серый
Dark
Цвет эффекта объемности. Должен быть темнее цвета заданного значением Button. По умолчанию — темно-серый
Mid
Цвет эффекта объемности. По умолчанию — средне-серый
Shadow
Цвет эффекта объемности. По умолчанию — черный

    На рис. 2 показано, каким областям виджета счетчика соответствуют некоторые из значений, приведенных в табл. 1.


Рис.2. Некоторые элементы палитры виджета счетчика

    Пример изменения палитры приведен в листинге программы, результат работы которй показан на рис. 3.

//создается объект палитры pal
//объекту палитры присваивается значение палитры виджета счетчика,
//которое извлекается вызовом метода palette()
QPalette pal = spb.palette();
//объект палитры подвергается изменениям с помощью метода setBrush()
//и серии вызовов метода setColor()
pal.setBrush(QPalette::Button, QBrush(Qt::red, Qt::Dense3Pattern));
pal.setColor(QPalette::ButtonText, Qt::blue);
pal.setColor(QPalette::Text, Qt::magenta);
//значение роли цвета QPalette::Base предназначено только для активного состояния
pal.setColor(QPalette::Active, QPalette::Base, Qt::green);
//полученная палитра устанавливается в виджет методом setPalette()
spb.setPalette(pal);
spb.resize(50, 50);
spb.show();
//применяем стиль Windows для того, чтобы наш виджет не использовал
//стиль платформы и выглядел везде одинаково
app.setStyle(QStyleFactory::create("windows"));


Рис.3. Приложение, демонстрирующее измененную палитру виджета

    Файлы приложения можно взять здесь.

    Листинг демонстрирует изменение палитры только одного виджета. На практике это нежелательно. Поэтому если необходимо изменить палитру для виджетов, то лучше делать это для всех виджетов сразу, централизованно. Для этого необходимо передать объект палитры в статический метод QAppilcation::setPalette().

    На следующем шаге рассмотрим понятие события.




Предыдущий шаг Содержание Следующий шаг