#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 не обновляется сам по себе