【问题标题】:Change QApplication stylefile dynamically动态更改 QApplication 样式文件
【发布时间】:2021-02-14 12:32:22
【问题描述】:

所以我有两个 qss 文件,其中包含所有按钮背景的样式表 一个文件用于普通模式,另一个文件用于暗模式,这两个文件之间的唯一区别是颜色选择。 StyleFile.qssDarkStyleFile.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 按钮设计,所以我尝试了其他方法

这是我的第二次尝试: ma​​inwindow.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

ma​​inwindow.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;
}

ma​​in.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 进行了设置,但是当我单击旨在更改路径的按钮时,没有任何反应,我没有知道是否因为样式文件仅在应用程序启动时设置并且在运行时无法更改,我是否需要更新某些内容或者如果我做错了什么,我希望能够将样式表从浅色更改为深色用户在应用程序中随时点击按钮时的模式,我做错了什么?或者有没有更简单的方法,请告诉我,如果还有什么不清楚或我没有提供足够的信息,请评论并告诉我,我会尽快修复。

【问题讨论】:

  • 您在if(ui-&gt;toggle-&gt;isChecked()) { 条件中的stylesheet_file 变量会隐藏紧接在条件之前定义的同名变量,因此永远不会使用。
  • 我已经研究了几天,我想我知道这样做是不可能的,因为 int main() 没有更新,我一直在考虑调用 QApplication在主窗口中,但我不能这样做,因为只允许一个 QApp 已经在主窗口中,而且我还阅读了有关线程的内容,所有这些内容对于像这样的简单任务来说都很复杂

标签: c++ qt


【解决方案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;
}

在 (1) 中定义的 stylesheet_file 变量与在 (2) 中定义的 stylesheet_file 变量完全分离/不同。与其在 (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;
}

【讨论】:

  • 谢谢,虽然它更干净了,但它不是问题,仍然只显示样式表 :/Images/Resources/StyleFile.qss但是按下按钮不会改变它,我很确定问题是 main 不会自行更新
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2014-12-19
  • 2013-02-16
  • 2014-04-13
  • 2018-09-27
相关资源
最近更新 更多