nayk1982
nayk1982April 21, 2018, 8:03 a.m.

Темы оформления (скины) для приложения

skin, qrc, QResource

Здравствуйте. Пытаюсь реализовать изменение скинов для приложения. Есть файл ресурсов global.qrc

<RCC>
    <qresource prefix="/style">
        <file>style.qss</file>
    </qresource>
    <qresource prefix="/png">
        <file>btn/1.png</file>
        <file>btn/2.png</file>
        <file>btn/3.png</file>
        ...
    </qresource>
</RCC>
Этот файл подключается к проекту в .pro
RESOURCES += global.qrc
Так же есть несколько внешних файлов с ресурсами: skin1.skin, skin2.skin, skin3.skin, собранных через rсс:
rcc.exe -binary skin1.qrc -o skin1.skin
Структура файла skin1.qrc полностью повторяет global.qrc , но у каждого скина свои картинки и стиль оформления .qss
В приложении используется графика из ресурсов как обычно: ":/png/btn/1.png" . После запуска видно значки из global.qrc - все в норме.

Теперь по сигналу, например при нажатии кнопки, подгружается внешний файл ресурсов:
void MainWindow::on_pushButton_Skin1_click()
{
    // Полный путь файла ресурсов:
    QString skinFile = path + "skin1.skin";
    // Загрузка
    if (QResource::registerResource(skinFile)) {
        QFile styleF(":/style/style.qss");
        // Применение стиля:
        if(styleF.exists() && styleF.open(QFile::ReadOnly)) {
            setStyleSheet( QString( styleF.readAll() ));
        }
    }
    else {
        // Не удалось загрузить ...
    }
}
Таблица стилей .qss применяется нормально, а вот значки на кнопках остаются из qlobal.qrc .
Вопрос: Как-нибудь можно после загрузки внешнего файла ресурсов указать приоритет, чтобы сначала проверялся путь из внешнего ресурса skin1 , а потом из global.qrc ? И как заставить все контролы перегрузить свои значки, если это нужно?


We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • April 22, 2018, 5:11 p.m.
  • (edited)

Добрый день!

Обычно значки устанавливаются через прямой вызов метода setIcon setImage и т.д., какой там присутствует в классе объекта...
При этом создаётся экземпляр данной иконки и под него выделяется память. То есть, если не переустановить иконку в зависимости от темы оформления, то иконка останется таже самая. Единственный момент, когда иконка может измениться автоматически, как я думаю, будет в том случае, если у вас в стилях прописаны эти иконки, например через background-image
QLabel {
    background-image: url(dense6pattern.png);
    background-repeat: repeat-xy;
}
Тогда, что-нибудь получится в данном случае.

Я когда делал для одного приложения тёмную и светлую тему оформления, использовал иконки с разными именами и при смене оформления перегружал все иконки. Но сейчас думаю, что не обязательно использовать разные имена иконок, достаточно иметь разное имя корневого префикса, который будет соответствовать названию темы оформления. Тогда у вас отпадёт необходимость в расстановке приоритетов проверки... если они вообще имеются, я про такое не слышал для стилей.

Тогда в каждом объекте, который имеет иконку или иное изображение нужно будет добавить слот reloadImage(const QString& themeName) и когда сменится стиль оформления, то вызвать сигналом этот слот, в котором вы переустановите иконку. Я бы так сделал.
    nayk1982
    • April 27, 2018, 7:20 a.m.

    Так и есть, графика, установленная через стили, меняется как надо. Насчет разных префиксов ресурсов тоже была мысль, но проблема в том, что приложение использует плагины, в которых тоже есть виджеты и кнопки со значками. В плагинах я не могу ничего изменить. Пока сделал так: поменял значки на нейтральные (белые, оттенки серого) которые сочетаются с разными цветами. Стили загружаются нормально и нужные цвета применяются и для приложения и для плагинов.

      Evgenii Legotckoi
      • April 27, 2018, 2:49 p.m.

      Как вариант, ещё можно написать C++ классы helper`ы, которые будут дополнять базовый stylesheet, устанавливать иконки для классов плагинов.
      И когда устанавливаете стили, то делать конкатенацию остальных стилей с этими специальными дополнениями.
      По идее же плагины воспринимают стили, а если они имеют кастомные классы, то и соответствующий stylsheet можно написать для этих классов.


      Но конечно, если там нет кастомных классов, то нужно как-то продумываьт иначе. Например, если сами пишите те плагины, то добавить в них методы для установки иконок.

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        Ua

        Qt - Test 001. Signals and slots

        • Result:84points,
        • Rating points4
        Ua

        Qt - Test 001. Signals and slots

        • Result:42points,
        • Rating points-8
        ОК

        Qt - Test 001. Signals and slots

        • Result:47points,
        • Rating points-6
        Last comments
        ИМ
        Игорь МаксимовNov. 22, 2024, 9:51 p.m.
        Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
        Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZEOct. 19, 2024, 5:19 p.m.
        Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь МаксимовOct. 5, 2024, 4:51 p.m.
        Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas5July 5, 2024, 8:02 p.m.
        QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Now discuss on the forum
        f
        firstlunoxodFeb. 15, 2025, 1:46 p.m.
        Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
        Дмитрий
        ДмитрийFeb. 3, 2025, 4:24 p.m.
        Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
        NW
        Nayo WaiJan. 30, 2025, 7:22 p.m.
        не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
        n
        nklyJan. 3, 2025, 12:52 p.m.
        Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
        M
        MarselAug. 17, 2023, 12:26 a.m.
        OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

        Follow us in social networks