Как изменить свойства таблицы стилей во время выполнения?
Я использую Qt, 5.9, Windows. Я пытаюсь изменить свойства таблицы стилей после запуска моей программы, чтобы пользователь мог настроить внешний вид программы.
Я не создал файл таблицы стилей. Вместо этого в режиме "Дизайн Qt" я перехожу к свойствам элемента, который пытаюсь изменить, нажимаю свойство "styleSheet" и добавляю свойства, которые хочу изменить, в окне, отображаемом Qt. Проверьте изображение 1* для примера. Красное поле показывает, куда я добавляю свойство styleSheet, а зеленое поле показывает, куда я нажимаю, чтобы попасть во всплывающее окно, которое позволяет мне добавить свойство styleSheet.
На рисунке 2* показано, как пишется код.ui, когда я так добавляю свойства таблицы стилей. Красное поле здесь показывает, как код автоматически записывается в файл.ui.
В меню "Правка" на панели меню я поместил подменю "Внешний вид" с несколькими предустановленными параметрами цветов программы и возможностью индивидуальной настройки программы. На изображении 3* вы можете увидеть меню.
Когда пользователь щелкает один из вариантов цвета, он должен изменить свойства таблицы стилей программы, чтобы цвета соответствовали выбранному цвету. Проблема происходит здесь. На рисунке 4 показан код для нажатия в следующих цветовых вариантах:
В красном квадрате ошибки, которые я получаю, и соответствующие строки, которые их породили. В желтом квадрате два из многих испытаний, которые я сделал. В синем квадрате наиболее эффективные, казалось бы, попытки. Тот, что в строке 21, не был скомпилирован, когда я делал скриншот, но жаловался только после компиляции (но он жаловался!). Это говорит, что "notr" не определен в этой области. Поэтому я попытался объявить это. Тот, что в строке 22, дал мне ошибку, когда я попробовал "string notr", сказав, что строка не была определена в этой области. Я включил и изменил его на "std::string notr", но он все еще жалуется. Как вы можете видеть в красном поле, оно говорит: "ожидаемое первичное выражение перед" notr "".
Что это значит? Как это исправить, чтобы я мог изменить свойства styleSheet моих элементов? Я думал об использовании файлов таблиц стилей для предустановленных цветов, но я бы хотел, по возможности, избегать использования большего количества файлов, чем необходимо. Кроме того, как пользователь сможет установить пользовательскую таблицу стилей, если параметры заданы заранее?
Спасибо за внимание и помощь.
PS: просто как бонусный вопрос. Я пытаюсь изменить основные цвета, а затем начать продвижение. В конечном счете, я хочу иметь возможность воспроизводить что-то вроде Substance Look and Feel, его способа обработки цветов, создания градиентов или придания заголовку заголовка более одного цвета. Кто-нибудь знает, какой маршрут выбрать? Я считаю, что таблицы стилей слишком слабы, чтобы воспроизводить эти эффекты, поэтому я хотел бы знать, как еще я могу изменить программу, чтобы она выглядела еще больше как скины Susbtance. Еще раз спасибо.
* Изображения 1, 2 и 3 отображаются в одном и том же файле изображений, поскольку Stackru не позволил бы мне публиковать более 2 изображений.
2 ответа
Функция setProperty()
согласно документации:
Устанавливает значение свойства name объекта в value.
Если свойство определено в классе с помощью
Q_PROPERTY
тогда true возвращается в случае успеха и false в противном случае. Если свойство не определено с помощьюQ_PROPERTY
и, следовательно, не указан в мета-объекте, он добавляется как динамическое свойство и возвращается false.
То есть свойство должно быть определено в классе с этим макросом, но таблица стилей не соответствует этим требованиям, поэтому вы не сможете получить доступ с помощью этого метода.
Для динамического изменения этого свойства вы должны использовать setStyleSheet()
, Например, в вашем случае:
void MainWindow::on_actionBlack_triggered()
{
centralWidget()->setStyleSheet("background-color: rgb(78, 78, 78);");
}
void MainWindow::on_actionBlack_Piano_triggered()
{
//another color
centralWidget()->setStyleSheet("background-color: rgb(111, 111, 111);");
}
void MainWindow::on_actionPok_dex_Orange_triggered()
{
//another color
centralWidget()->setStyleSheet("background-color: rgb(123, 22, 111);");
}
Замечания:
Старайтесь избегать использования
std::string
, вы должны использоватьQString
,Инструкция
some_function(type_variable name_variable = some_value);
не является допустимым синтаксисом C/C++
Когда в дизайне XML:
<property name="styleSheet">
<string notr="true"> background-color: rgb (78, 78, 78);
font 10pt "Arial";
color: rgb(220, 220, 220);<string>
</property>
notr="true"
означает, что когда вы хотите использовать систему перевода Qt, эта строка не будет принята во внимание: No Translations.
Этот xml никогда не используется компилятором напрямую, который преобразует эти файлы.ui в.h с именем ui_yourdesign.h.
setStyleSheet()
Функция является частью QWidget, поэтому любой класс, который наследуется от QWidget
может использовать это, то есть QMenubar, QLineEdit, QTextEdit.
Например, отображаемый вами xml:
Покажите, что к свойству применяется меню Bar, эту инструкцию можно изменить через C++ с помощью следующего оператора:
ui->menuBar->setStyleSheet("background-color: rgb (78, 78, 78); font 10pt; color: rgb(220, 220, 220);")
Предположим, у вас есть файл таблицы стилей QSS с именем "default.qss", который определяет вашу тему:
QMenu::item{
color: black;
font-size: 14px;
}
QWidget[accessibleName="myVideoWidget"] {
border: 2px solid #383638;
}
Вы можете изменить стиль во время выполнения следующим образом:
QFile file(":/qss/default.qss");
file.open(QFile::ReadOnly);
QString styleSheet = QString::fromLatin1(file.readAll());
// Option 1: Set theme for the inner central widget
ui->centralWidget->setStyleSheet(styleSheet);
// Option 2: Set theme for the entire application
this->setStyleSheet(styleSheet);
Вы можете использовать, например, myPushButton->setStyleSheet("* { color: blue }");
посмотрите эту страницу в вашем случае это ui->menuBar->setStyleSheet("your style sheet properties");
или же ui->centralWidget->setStyleSheet("your style sheet properties");