При работе с Qt, мощной средой C++ для создания кроссплатформенных приложений, настройка тем значков может изменить внешний вид вашего приложения. В этой статье я рассмотрю систему тем значков Qt и покажу вам, как настраивать значки для разных тем с помощью простого примера кода.

Класс QIcon обеспечивает способ управления и отображения значков в приложениях Qt. Иконки — это графические представления, часто используемые для обозначения действий, элементов или объектов в пользовательском интерфейсе. QIcon::fromTheme работает с темами значков в соответствии со спецификацией темы значков freedesktop. Последнюю версию спецификации значка freedesktop можно получить здесь:



Следующий код C++ можно выполнить, чтобы получить путь поиска, по которому Qt ищет значки:

qDebug() << QIcon::themeSearchPaths();

При выполнении вывод консоли может выглядеть следующим образом:

(":/icons")

Этот вывод показывает, что Qt ищет значки в каталоге icons.

Чтобы продемонстрировать процесс настройки тем значков, давайте рассмотрим пример переключения между светлой и темной темами. Мы будем использовать стиль Fusion, предоставленный Qt, и соответствующим образом изменим цветовую палитру.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qDebug() << QIcon::themeSearchPaths();

    bool darkMode = false;

    if ( darkMode )
    {
        SetDarkPalette();
        QIcon::setThemeName("dark");
    }
    else
    {
        SetLightPalette();
        QIcon::setThemeName("light");
    }
    qtcustomtheme_icon w;
    w.show();
    return a.exec();
}

Код переключается между темным и светлым режимами на основе переменной darkMode, которая инициализируется как false. Возможно, вы захотите изменить это значение на true , если собираетесь запускать в темном режиме. Функции SetDarkPalette() и SetLightPalette() в main.cpp показывают, как установить темную и светлую палитру соответственно. Эти палитры определяют цветовую схему для различных элементов пользовательского интерфейса. В зависимости от выбранной темы будет применена темная или светлая палитра.

void SetDarkPalette()
{
    qApp->setStyle(QStyleFactory::create("Fusion"));

    QPalette darkPalette;
    darkPalette.setColor(QPalette::Window, QColor(53, 53, 53));
    darkPalette.setColor(QPalette::WindowText, Qt::white);
    darkPalette.setColor(QPalette::Base, QColor(25, 25, 25));
    darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
    darkPalette.setColor(QPalette::Text, Qt::white);
    darkPalette.setColor(QPalette::Button, QColor(53, 53, 53));
    darkPalette.setColor(QPalette::ButtonText, Qt::white);
    darkPalette.setColor(QPalette::BrightText, Qt::red);

    qApp->setPalette(darkPalette);

}

void SetLightPalette()
{
    qApp->setStyle(QStyleFactory::create("Fusion"));
}

Вот icons directory, где Qt ищет значки для текущей темы. Текущая тема установлена ​​с QIcon::setThemeName(“light”) для светлой темы и QIcon::setThemeName(“dark”) для темной темы.

icons
├── dark
│   └── svg
│       └── check.svg
│   └── png
│       └── check.png
│       └── cancel.png
└── index.theme
├── light
│   └── svg
│       └── check.svg
│   └── png
│       └── check.png
│       └── cancel.png
└── index.theme

Индексные файлы для светлой и темной тем (light.theme и dark.theme) определяют различные аспекты темы. Тема значков — это набор значков, который позволяет приложениям создавать общий вид. Затем вы можете выбрать тему значков, которую хотите использовать, и все приложения будут использовать значки из текущей темы. Иконки и темы ищутся в наборе каталогов. По умолчанию приложения должны искать в каталоге :/icons (см. QIcon::themeSearchPaths()). Вы можете добавить свои собственные каталоги значков в этот список, а также расширить или изменить его. В примере проекта есть каталоги svg и png для каждой темной и светлой темы.

Добавление свойств индекса SVG и PNG для светлой и темной тем в файл индекса следующим образом:

Файл определения индекса светлой темы:

[Icon Theme]
Name=light
Comment=light theme icons
PanelDefault=22
PanelSizes=22
Directories=svg,png

[svg]
Size=48
Context=Applications
MinSize=16
MaxSize=512
Type=Scalable

[png]
Size=24
Context=Applications
MinSize=16
MaxSize=512
Type=Fixed

Файл определения индекса темной темы:

[Icon Theme]
Name=dark
Comment=dark theme icons

PanelDefault=22
PanelSizes=22

Directories=svg,png

[svg]
Size=48
Context=Applications
MinSize=16
MaxSize=512
Type=Scalable

[png]
Size=24
Context=Applications
MinSize=16
MaxSize=512
Type=Fixed

Все значки и индексные файлы тем необходимо добавить в файл ресурсов приложения:

<RCC>
    <qresource prefix="/">
        <file>icons/dark/index.theme</file>
        <file>icons/light/index.theme</file>
        <file>icons/light/svg/check.svg</file>
        <file>icons/light/png/check.png</file>
        <file>icons/light/png/cancel.png</file>
        <file>icons/dark/png/check.png</file>
        <file>icons/dark/png/cancel.png</file>
        <file>icons/dark/svg/check.svg</file>
    </qresource>
</RCC>

Откройте Qt Designer и добавьте две кнопки. На изображении ниже показано, как установить значок темы для кнопки OK .

Вы можете установить тему значка программно, используя следующий код:

qtcustomtheme_icon::qtcustomtheme_icon(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    ui.pushButtonOK->setIcon( QIcon::fromTheme("check") );
    ui.pushButtonCancel->setIcon( QIcon::fromTheme("cancel") );
}

Когда приложение запускается с включенным темным режимом.

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

Вы можете найти полный исходный код этого примера в репозитории Git:

https://github.com/yakupc/articles-and-code/tree/main/qt/qt-custom-theme_icon