Evgenii Legotckoi
27 березня 2017 р. 23:20

Qt/C++ - Урок 060. Налаштування зовнішнього вигляду програми під час виконання

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

Подивимося на два варіанти оформлення стилю програми з використанням вбудованого стилю Fusion. А саме буде темне оформлення та світле .


У досліджуваному додатку є кілька елементів інтерфейсу, щоб показати різниця стилів оформлення. Але є й два функціональні елементи, які змінюють стиль програми у рантаймі. Це дві кнопки з написами: 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();
}

віджет.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());
}

Завантажити архів з проектом

Рекомендовані статті на цю тему

По статті запитували0питання

4

Вам це подобається? Поділіться в соціальних мережах!

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
  • 01 липня 2017 р. 00:19

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

b
  • 03 липня 2017 р. 13:46

thanks for the reply, great tutorial


Evgenii Legotckoi
  • 03 липня 2017 р. 13:48

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

s
  • 09 жовтня 2021 р. 18:26

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

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

Evgenii Legotckoi
  • 11 жовтня 2021 р. 11:21

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

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

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

s
  • 12 жовтня 2021 р. 22:36

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

s
  • 14 жовтня 2021 р. 21:27

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

Коментарі

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