如何在运行时更改 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 "Arial";
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);
我正在使用 Qt,5.9,Windows。 我试图在我的程序启动后更改样式表属性,以便用户可以自定义程序的外观。
我还没有创建样式表文件。相反,在 Qt 的设计模式下,我转到要更改的元素的属性,单击“styleSheet”属性,然后在 Qt 显示的 window 中添加我想要更改的属性. 检查图像 1* 作为示例。红色框显示我添加样式表 属性 的位置,绿色框显示我单击以进入弹出窗口 window 的位置,它允许我添加样式表 属性.
图 2* 显示了当我以这种方式添加 styleSheet 属性时 .ui 代码是如何编写的。这里的红框是.ui文件中自动写入代码的方式。
在menuBar的编辑菜单中,我放置了一个名为“外观”的子菜单,其中有几个预设的程序颜色选项和一个自定义程序的选项。 在图 3* 中,您可以看到菜单。
当用户单击其中一个颜色选项时,它应该更改程序的 styleSheet 属性,以便颜色与所选颜色相匹配。问题发生在这里。 图 4 显示了单击这些颜色选项的代码:
在红色方块中,我得到的错误,以及产生这些错误的相应行。
在黄色方块中,是我做过的许多试验中的两个。
在蓝色方块中,看似最有效的尝试。 21行那个我截图的时候没有编译,但是编译之后才报错(但是确实报错了!)。它说“notr”未在此范围内定义。所以我试着声明它。
当我尝试“string notr”时,第 22 行中的那个给了我一个错误,说该字符串未在此范围内定义。我包含了
这是什么意思?我该如何解决这个问题,以便我可以更改元素的 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 usingQ_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 "Arial";
color: rgb(220, 220, 220);<string>
</property>
notr="true"
表示当你要使用Qt翻译系统时,这个字符串将不会被考虑在内:No Translations.
编译器永远不会直接使用 xml,它会将这些 .ui 文件转换为名称为 ui_yourdesign.h.
的 .hsetStyleSheet()
函数是 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);