Как переместить таблицу стилей Qt во внешний файл, но сохранить ее скомпилированной в ресурсах?

У моего приложения Qt есть большая таблица стилей с множеством полей, пикселей и других элементов, непосредственно основанных на графике и связанных с ними. Я был бы рад передать все это дизайнеру, но таблица стилей хранится в файле .ui, что неудобно для дизайнера; она предпочла бы видеть отдельный файл и редактировать его, используя ее обычные инструменты.

Я хочу переместить таблицу стилей во внешний файл .qss, добавить этот файл к ресурсам программы и связать его с файлом .ui, чтобы таблица стилей автоматически компилировалась и использовалась виджетом, а приложение не получало сохранить файл таблицы стилей и загрузить его во время выполнения.

Как этого добиться?

7

Решение

Скопируйте все ваши стили в файл и переименуйте его в нечто вроде stylesheet.qss
Затем включите его в свой qrc файл как новый элемент ресурса. Вы можете просто сделать это, отредактировав свой qrc файл, если у вас уже есть. См. Документацию о том, как добавить новый ресурс.

Затем измените ваш код следующим образом, чтобы прочитать содержимое qss файл во время выполнения и применить стили к вашему приложению.

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QFile file(":/stylesheet.qss");
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
a.setStyleSheet(file.readAll());
file.close();
}

MainWindow w;
w.show();

return a.exec();
}

Примечание: когда вы делаете изменения в stylesheet.qss, вы должны скомпилировать qrc файл для вступления изменений в силу.

12

Другие решения

Я устанавливаю таблицу стилей, когда приложение запускается из внешнего файла. Также для дизайнера мы добавили кнопку «перезагрузить таблицу стилей». Таким образом, дизайнер может изменить файл и сразу же попробовать внести изменения.

Например:

QFile styleFile("stylesheet.qss");
styleFile.open(QFile::ReadOnly);
QByteArray bytes = styleFile.readAll();
QApplication *app = (QApplication*)QApplication::instance();
app->setStyleSheet(newStyleSheet);
3

По вопросам рекламы [email protected]