Evgenii Legotckoi
27 марта 2017 г. 23:20

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

Содержание

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

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


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

main.cpp

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

  1. #include "widget.h"
  2. #include <QApplication>
  3. #include <QStyleFactory>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. // Установим стиль оформления
  9. // Стандартная палитра является светлой
  10. qApp->setStyle(QStyleFactory::create("Fusion"));
  11.  
  12. Widget w;
  13. w.show();
  14.  
  15. return a.exec();
  16. }

widget.h

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

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5.  
  6. namespace Ui {
  7. class Widget;
  8. }
  9.  
  10. class Widget : public QWidget
  11. {
  12. Q_OBJECT
  13.  
  14. public:
  15. explicit Widget(QWidget *parent = 0);
  16. ~Widget();
  17.  
  18. private slots:
  19. // Слот обработчик клика кнопки для установки тёмного оформления
  20. void on_darkPushButton_clicked();
  21. // Слот обработчик клика кнопки для установки светлого оформления
  22. void on_lightPushButton_clicked();
  23.  
  24. private:
  25. Ui::Widget *ui;
  26. };
  27.  
  28. #endif // WIDGET_H

widget.cpp

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

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3.  
  4. #include <QApplication>
  5.  
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. }
  12.  
  13. Widget::~Widget()
  14. {
  15. delete ui;
  16. }
  17.  
  18. void Widget::on_darkPushButton_clicked()
  19. {
  20. // Создаём палитру для тёмной темы оформления
  21. QPalette darkPalette;
  22.  
  23. // Настраиваем палитру для цветовых ролей элементов интерфейса
  24. darkPalette.setColor(QPalette::Window, QColor(53, 53, 53));
  25. darkPalette.setColor(QPalette::WindowText, Qt::white);
  26. darkPalette.setColor(QPalette::Base, QColor(25, 25, 25));
  27. darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
  28. darkPalette.setColor(QPalette::ToolTipBase, Qt::white);
  29. darkPalette.setColor(QPalette::ToolTipText, Qt::white);
  30. darkPalette.setColor(QPalette::Text, Qt::white);
  31. darkPalette.setColor(QPalette::Button, QColor(53, 53, 53));
  32. darkPalette.setColor(QPalette::ButtonText, Qt::white);
  33. darkPalette.setColor(QPalette::BrightText, Qt::red);
  34. darkPalette.setColor(QPalette::Link, QColor(42, 130, 218));
  35. darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218));
  36. darkPalette.setColor(QPalette::HighlightedText, Qt::black);
  37.  
  38. // Устанавливаем данную палитру
  39. qApp->setPalette(darkPalette);
  40. }
  41.  
  42. void Widget::on_lightPushButton_clicked()
  43. {
  44. // Для возврата к светлой палитре достаточно
  45. // будет установить стандартную палитру из темы оформления
  46. qApp->setPalette(style()->standardPalette());
  47. }
  48.  

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

Вам это нравится? Поделитесь в социальных сетях!

b
  • 28 июня 2017 г. 14:19

It is possible that you upload the project please

With example.
Evgenii Legotckoi
  • 28 июня 2017 г. 17:02

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

Evgenii Legotckoi
  • 1 июля 2017 г. 0:19

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

b
  • 3 июля 2017 г. 13:46

thanks for the reply, great tutorial


Evgenii Legotckoi
  • 3 июля 2017 г. 13:48

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

s
  • 9 октября 2021 г. 18:26

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

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

Evgenii Legotckoi
  • 11 октября 2021 г. 11:21

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

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

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

s
  • 12 октября 2021 г. 22:36

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

s
  • 14 октября 2021 г. 21:27

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

Комментарии

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