nayk1982
nayk1982April 20, 2018, 10:03 p.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, 7:11 a.m.
  • (edited)

Добрый день!

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

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

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

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

      Evgenii Legotckoi
      • April 27, 2018, 4:49 a.m.

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


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

        Comments

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

        C ++ - Test 004. Pointers, Arrays and Loops

        • Result:50points,
        • Rating points-4
        m

        C ++ - Test 004. Pointers, Arrays and Loops

        • Result:80points,
        • Rating points4
        m

        C ++ - Test 004. Pointers, Arrays and Loops

        • Result:20points,
        • Rating points-10
        Last comments
        i
        innorwallNov. 14, 2024, 9:26 p.m.
        Qt/C++ - Lesson 031. QCustomPlot – The build of charts with time buy generic priligy We can just chat, and we will not lose too much time anyway
        i
        innorwallNov. 14, 2024, 7:03 p.m.
        Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
        i
        innorwallNov. 14, 2024, 12:07 p.m.
        Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
        i
        innorwallNov. 14, 2024, 11:42 a.m.
        How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
        i
        innorwallNov. 14, 2024, 9:09 a.m.
        Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
        Now discuss on the forum
        i
        innorwallNov. 14, 2024, 3:39 a.m.
        добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
        i
        innorwallNov. 11, 2024, 10:55 a.m.
        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
        9
        9AnonimOct. 25, 2024, 9:10 a.m.
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

        Follow us in social networks