Евгений Легоцкой27 марта 2017 г. 23:20

Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме

Допустим есть задача изменения внешнего вида приложения, написанного на QWidget . Для изменения стиля приложения приложения можно использовать как QPalette классы, так и установку стиля через QStyleSheet для конкретных элементов, так и с использованием QStyle класса и встроенных стилей, получаемых с помощью QStyleFactory (Или созданных самостоятельно с помощью QStylePlugin ).

Посмотрим на два варианта оформления стиля приложения с использованием встроенного стиля Fusion. А именно будет тёмное оформление и светлое .

ADS

В исследуемом приложении есть несколько элементов интерфейса, чтобы показать, различие стилей оформления. Но есть и два функциональных элемента, которые изменяют стиль приложения в рантайме. Это две кнопки с надписями: Dark и Light. Каждая кнопка имеет свой слот обработки сигнала clicked.

main.cpp

При запуске приложения сразу установим тему оформления Fusion.

#include "widget.h"
#include <QApplication>
#include <QStyleFactory>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // Установим стиль оформления
    // Стандартная палитра является светлой
    qApp->setStyle(QStyleFactory::create("Fusion"));

    Widget w;
    w.show();

    return a.exec();
}

widget.h

Данный класс отвечает за окно приложения, которое было показано выше. В заголовочном файле объявлены два слота обработки кликов по кнопке Dark и Light , которые добавлялись в приложение через графический дизайнер.

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    // Слот обработчик клика кнопки для установки тёмного оформления
    void on_darkPushButton_clicked();
    // Слот обработчик клика кнопки для установки светлого оформления
    void on_lightPushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

А в реализации слотов уже создаётся необходимая палитра, для оформления интерфейса приложения на Qt. При этом стиль приложения будет изменяться в рантайме, без перезапуска самого приложения.

#include "widget.h"
#include "ui_widget.h"

#include <QApplication>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_darkPushButton_clicked()
{
    // Создаём палитру для тёмной темы оформления
    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::ToolTipBase, Qt::white);
    darkPalette.setColor(QPalette::ToolTipText, Qt::white);
    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);
    darkPalette.setColor(QPalette::Link, QColor(42, 130, 218));
    darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218));
    darkPalette.setColor(QPalette::HighlightedText, Qt::black);

    // Устанавливаем данную палитру
    qApp->setPalette(darkPalette);
}

void Widget::on_lightPushButton_clicked()
{
    // Для возврата к светлой палитре достаточно
    // будет установить стандартную палитру из темы оформления
    qApp->setPalette(style()->standardPalette());
}

Скачать архив с проектом

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate
b

It is possible that you upload the project please

With example.

Yes. Of course. But some later. I haven't got opportunity for this now.

I added archive with project. You will find it in the end of artcile.

b

thanks for the reply, great tutorial


No problem. If You need some advices, You can ask me and community of site on the forum .

s

Добрый день, тема хоть и старая но попробую спросить...

У меня получается на лету менять стиль приложения если грузить style.css, а вот как обратно в стандарт никак, только после рестарта приложения. Есть варианты?

Скорее всего можно выдернуть стиль с помощью QStyleFactory и установить его через

qApp->setStyle(QStyleFactory::create("windowsvista"));

Список доступных стилей можно получить через статический метод QStyleFactor::keys()

s

Спасибо, завтра опробую и отпишусь по результату

s

Добрый вечер, на "лету" не работает, только перезапуск

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
k

C++ - Тест 002. Константы

  • Результат:33баллов,
  • Очки рейтинга-10
k

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
k

C++ - Тест 003. Условия и циклы

  • Результат:64баллов,
  • Очки рейтинга-1
Популярные публикации за последние 90 дней
Последние комментарии
R

Установка драйвера QIBASE (Firebird) Qt 6.2.1 на openSUSE Tumbleweed

Just that is necessary. A good theme, I will participate. Together we can come to a right answer. https://gay0day.com
C

Установка драйвера QIBASE (Firebird) Qt 6.2.1 на openSUSE Tumbleweed

ротационные прокси
Y
  • Yar
  • 15 ноября 2021 г. 2:33

QML - Урок 004. Сигналы и слоты в Qt QML

У связывания интерейса прогрммы с ядром через контекст (context->setContextProperty("appCore", &appCore);) есть один существенный недостаток, упоминание о котором я нигде не нашел, а выяв…
v
  • v
  • 9 ноября 2021 г. 22:07

Сборка драйвера QMYSQL (MariaDB) Windows 10 x64 QT 5.13.0 Mingw73_64

Спасибо, добрый человек! Перелопатил весь stackoverflow в поисках ответа почему MySql....no , не осознавая что mingw32-make clean не очищает то что надо. После удаления вышеуказаных…

Django - Урок 045. Перемещение моделей из одного приложения в другое

у меня была проблема что у меня в кубере автоматом миграция запускалась сделал так (как вариант решения, добовлял каждой миграции RunSQL): operations = [ migrations.RunSQL(''' …
Сейчас обсуждают на форуме
s

Ключевое слово class

Разобрался,на стаковерфлоу нашел топик и понял почему так происходило .
ИП

For each

For each разработан Microsoft для своего компилятора VS, в стандарте его нет, на официальном сайте не рекомендуется его использовать
U

Qt - как скомпилировать 32bit-программу под Linux 64bit?

Неожиданно появилась необходимость скомпилировать программу для 32-разрядного Linux-а сидя на 64-разрядном... Читал-листал интернеты, мало что понял... Проверил версию: gcc -v Target:…

Авторизация в приложении.

Ничего не надо скачивать, всё должно работать "из коробки".
o
  • ost.vld
  • 22 ноября 2021 г. 0:12

Создание страницы в QML, где нужно выровнить текст по всей ширине экрана и создать скроллинг

https://doc.qt.io/qt-5/qml-qtquick-controls2-scrollview.html https://evileg.com/ru/post/186/
О нас
Услуги
© EVILEG 2015-2021
Рекомендует хостинг TIMEWEB