如何在运行时更改 styleSheet 属性?

How to change the styleSheet properties at runtime?

我正在使用 Qt,5.9,Windows。 我试图在我的程序启动后更改样式表属性,以便用户可以自定义程序的外观。

我还没有创建样式表文件。相反,在 Qt 的设计模式下,我转到要更改的元素的属性,单击“styleSheet”属性,然后在 Qt 显示的 window 中添加我想要更改的属性. 检查图像 1* 作为示例。红色框显示我添加样式表 属性 的位置,绿色框显示我单击以进入弹出窗口 window 的位置,它允许我添加样式表 属性.

图 2* 显示了当我以这种方式添加 styleSheet 属性时 .ui 代码是如何编写的。这里的红框是.ui文件中自动写入代码的方式。

在menuBar的编辑菜单中,我放置了一个名为“外观”的子菜单,其中有几个预设的程序颜色选项和一个自定义程序的选项。 在图 3* 中,您可以看到菜单。

当用户单击其中一个颜色选项时,它应该更改程序的 styleSheet 属性,以便颜色与所选颜色相匹配。问题发生在这里。 图 4 显示了单击这些颜色选项的代码:

在红色方块中,我得到的错误,以及产生这些错误的相应行。 在黄色方块中,是我做过的许多试验中的两个。 在蓝色方块中,看似最有效的尝试。 21行那个我截图的时候没有编译,但是编译之后才报错(但是确实报错了!)。它说“notr”未在此范围内定义。所以我试着声明它。 当我尝试“string notr”时,第 22 行中的那个给了我一个错误,说该字符串未在此范围内定义。我包含了 ,并将其更改为“std::string notr”,但它仍在抱怨。正如您在红色框中看到的那样,它表示“'notr' 之前的预期主表达式”。

这是什么意思?我该如何解决这个问题,以便我可以更改元素的 styleSheet 属性? 我考虑过使用 styleSheet 文件作为预设颜色,但我想尽可能避免使用比需要更多的文件。另外,如果选项是预先设置的,用户如何设置自定义样式表?

感谢您的关注与帮助

P.S.: 作为加分题。我正在尝试先更改基本颜色,然后再开始前进。 最终,我希望能够重现 Substance Look and Feel 之类的东西,它处理颜色、制作渐变或为 titleBar 提供不止一种颜色的方式。有谁知道要走什么路线?我相信 styleSheets 太弱而无法重现这些效果,所以我想知道我还能如何更改程序以使其看起来更像 Susbtance 的皮肤。 再次感谢。

*图片 1、2 和 3 出现在同一个图片文件中,因为 Whosebug 不允许我 post 超过 2 张图片。

你可以使用例如 myPushButton->setStyleSheet("* { color: blue }"); 看看 this page 在你的情况下它是 ui->menuBar->setStyleSheet("your style sheet properties");ui->centralWidget->setStyleSheet("your style sheet properties");

函数 setProperty() 根据文档:

Sets the value of the object's name property to value.

If the property is defined in the class using Q_PROPERTY then true is returned on success and false otherwise. If the property is not defined using Q_PROPERTY, and therefore not listed in the meta-object, it is added as a dynamic property and false is returned.

也就是说,属性 必须用那个宏在 class 中定义,但是样式表不符合那些要求ui,所以你将无法访问那个方法。

要动态更改 属性,您必须使用 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 文件转换为名称为 ui_yourdesign.h.

的 .h

setStyleSheet() 函数是 QWidget 的一部分,因此任何继承自 QWidget 的 class 都可以使用它,即 QMenubar、QLineEdit、QTextEdit。

比如你显示的xml:

显示 Bar 菜单正在应用于 属性,可以通过 C++ 使用以下语句更改该指令:

ui->menuBar->setStyleSheet("background-color: rgb (78, 78, 78); font 10pt; color: rgb(220, 220, 220);")

假设您有一个名为“default.qss”的 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);