Динамически изменять файл стиля QApplication

#c #qt

#c #qt

Вопрос:

Итак, у меня есть два файла qss, которые содержат таблицу стилей всех фонов кнопок, один файл для обычного режима, а другой для темного режима, единственное различие между двумя файлами — выбор цвета. StyleFile.qss и DarkStyleFile.qss

Раньше, когда у меня был только один qss, я устанавливал его в приложении следующим образом:

 #include "mainwindow.h"
#include <QFile>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow w;
           QFile  stylesheet_file(":/Images/Resources/StyleFile.qss");
           stylesheet_file.open(QFile::ReadOnly);
           QString stylesheet = QLatin1String(stylesheet_file.readAll());
           app.setStyleSheet(stylesheet);
    w.show();    
    return app.exec();
}

  

Теперь, когда у меня есть два файла qss, я хочу иметь возможность переключаться между ними одним нажатием кнопки в приложении, скажем, у меня есть флажок или кнопка переключения с именем «darkmode», и после его проверки путь изменяется на: «:/Images/Resources /DarkStyleFile.qss»

Это моя первая попытка:

 //mainwindow.cpp with QPushbutton set as checkable named toggle

void MainWindow::on_toggle_clicked()
{
    QApplication *app= (QApplication*)QApplication::instance();
    app->processEvents();
    QFile  stylesheet_file(":/Images/Resources/StyleFile.qss");
    if(ui->toggle->isChecked()){
    QFile  stylesheet_file(":/Images/Resources/DarkStyleFile.qss");
    }
    stylesheet_file.open(QFile::ReadOnly);
    QString stylesheet = QLatin1String(stylesheet_file.readAll());
    app->setStyleSheet(stylesheet);
}

  
 int main(int argc, char *argv[])
{
//create application and main window
    QApplication app(argc, argv);
    MainWindow w; 
    w.show();    
    return app.exec();
}
  

Это вообще не сработало, оно показало мне дизайн кнопок qt по умолчанию без фона, поэтому я попробовал что-то еще

Это моя вторая попытка: mainwindow.h

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "admininterface.h"
#include "employeeinterface.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QString on_toggle_clicked();
private slots:
    void on_Exit_clicked();
    void on_Login_clicked();
private:
    Ui::MainWindow *ui;
    AdminInterface *Admin;
};
#endif // MAINWINDOW_H
  

mainwindow.cpp

 QString MainWindow::on_toggle_clicked()
{
    QFile  stylesheet_file(":/Images/Resources/StyleFile.qss");
    if(ui->toggle->isChecked()){
    QFile  stylesheet_file(":/Images/Resources/DarkStyleFile.qss");
    }
    stylesheet_file.open(QFile::ReadOnly);
    QString stylesheet = QLatin1String(stylesheet_file.readAll());
    return stylesheet;
}
  

main.cpp

 #include "mainwindow.h"
#include <QFile>
#include <QApplication>

int main(int argc, char *argv[])
{
//create application and main window
    QApplication app(argc, argv);
    MainWindow w;
    app.setStyleSheet(w.on_toggle_clicked());
    w.show();    
    return app.exec();
}
  

Когда я запускаю приложение сейчас, оно настраивается с помощью обычной таблицы стилей StyleFile.qss, но на самом деле ничего не происходит, когда я нажимаю на кнопку, предназначенную для изменения пути, я не знаю, потому ли это, что файл стилей настраивается только в начале приложения и не может быть измененнужно ли мне что-то обновлять во время работы или, если я сделал что-то не так, я хочу иметь возможность изменять таблицу стилей из светлого в темный режим, находясь в приложении, в любое время, когда пользователь нажимает кнопку, что я сделал не так? Или есть гораздо более простой способ сделать это, пожалуйста, дайте мне знать, и если что-то все еще неясно или я дал недостаточно информации, пожалуйста, прокомментируйте и дайте мне знать, я исправлю как можно скорее.

Комментарии:

1. Ваша stylesheet_file переменная в if(ui->toggle->isChecked()) { условном затеняет переменную с тем же именем, определенную непосредственно перед условным и, следовательно, никогда не используемую.

2. Я работал над этим несколько дней, и я думаю, что знаю, что это невозможно сделать таким образом, поскольку int main() не обновляется, я думал вызвать QApplication в mainwindow, но я не мог этого сделать, поскольку разрешено только одно qApp, которое уже есть в main,также я читал материал о потоковой передаче и все, что усложняло простую задачу, подобную этой

Ответ №1:

Рассмотрим вашу MainWindow::on_toggle_clicked реализацию…

 QString MainWindow::on_toggle_clicked()
{
    QFile  stylesheet_file(":/Images/Resources/StyleFile.qss"); // (1)
    if(ui->toggle->isChecked()){
        QFile  stylesheet_file(":/Images/Resources/DarkStyleFile.qss"); // (2)
    }
    stylesheet_file.open(QFile::ReadOnly);
    QString stylesheet = QLatin1String(stylesheet_file.readAll());
    return stylesheet;
}
  

stylesheet_file Переменная, определенная в (1), полностью отделена / отличается от stylesheet_file переменной, определенной в (2). Вместо того, чтобы определять новую переменную с тем же именем в (2), вы должны установить имя файла, связанное с ранее определенной переменной, используя…

 stylesheet_file.setFileName(":/Images/Resources/DarkStyleFile.qss");
  

Таким образом, результирующая реализация будет выглядеть примерно так…

 QString MainWindow::on_toggle_clicked ()
{
    QFile  stylesheet_file(":/Images/Resources/StyleFile.qss");
    if (ui->toggle->isChecked()){
        stylesheet_file.setFileName(":/Images/Resources/DarkStyleFile.qss");
    }
    stylesheet_file.open(QFile::ReadOnly);
    QString stylesheet = QLatin1String(stylesheet_file.readAll());
    return stylesheet;
}
  

Комментарии:

1. Спасибо, хотя он намного чище, но это не проблема, по-прежнему отображается только таблица стилей :/Images/Resources/StyleFile.qss , но нажатие кнопки не изменит его, я уверен, что проблема в том, что main не обновляется сам по себе