Как изменить свойства таблицы стилей во время выполнения?

Я использую Qt, 5.9, Windows. Я пытаюсь изменить свойства таблицы стилей после запуска моей программы, чтобы пользователь мог настроить внешний вид программы.

Я не создал файл таблицы стилей. Вместо этого в режиме "Дизайн Qt" я перехожу к свойствам элемента, который пытаюсь изменить, нажимаю свойство "styleSheet" и добавляю свойства, которые хочу изменить, в окне, отображаемом Qt. Проверьте изображение 1* для примера. Красное поле показывает, куда я добавляю свойство styleSheet, а зеленое поле показывает, куда я нажимаю, чтобы попасть во всплывающее окно, которое позволяет мне добавить свойство styleSheet.

На рисунке 2* показано, как пишется код.ui, когда я так добавляю свойства таблицы стилей. Красное поле здесь показывает, как код автоматически записывается в файл.ui.

В меню "Правка" на панели меню я поместил подменю "Внешний вид" с несколькими предустановленными параметрами цветов программы и возможностью индивидуальной настройки программы. На изображении 3* вы можете увидеть меню.

Изображения 1, 2 и 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 &quot;Arial&quot;;
 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");

Другие вопросы по тегам