【问题标题】:How to change the styleSheet properties at runtime?如何在运行时更改 styleSheet 属性?
【发布时间】:2018-01-13 09:00:54
【问题描述】:

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

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

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

在 menuBar 的 Edit 菜单中,我放置了一个名为“Appearance”的子菜单,其中包含一些预设的程序颜色选项和一个自定义程序的选项。 在图 3* 中,您可以看到菜单。

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

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

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

感谢您的关注和帮助。

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

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

【问题讨论】:

标签: c++ qt qt5 qt-designer qtstylesheets


【解决方案1】:

函数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 文件转换为名称为 ui_yourdesign.h 的 .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);")

【讨论】:

  • 有些事情你说我知道,有些事情我没有想到(特别是some_function(type_variable name_variable = some_value);,不知道我怎么能传递std::string string = "string")。无论如何,多么完整的答案!谢谢!
  • 您必须转换为 QString:std::string s = "some_text"; QString qstring = QString::fromUtf8(s.c_str()); centralWidget()-&gt;setStyleSheet(qstring);。我建议使用 Qt 的原生数据类型。
  • 如果我们使用 Qt 的原生类型,上面的简化为:QString qstring = "some_text"; centralWidget()-&gt;setStyleSheet(qstring);
  • 所有 CSS 不兼容 Qt StyleSheet,即 CSS 不等于 QSS,更多信息请阅读以下内容:doc.qt.io/qt-5/stylesheet-syntax.html
  • 没用(顺便说一句,这是我尝试过的方法之一)。有没有我必须调用的函数来“更新”styleSheet,或者再次渲染它(我试过 repaint()、render()、setVisible(false) 和 setVisible(true))?
【解决方案2】:

假设您有一个名为“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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • centralWidget()-&gt;setStyleSheet("your style sheet properties"); 我如何写“你的样式表属性”?我试过(以背景颜色为例)"{background-color: rgb(250, 120, 15);}""background-color: rgb(250, 120, 15);""centralWidget()-&gt;setProperty("styleSheet", "background-color: rgb(250, 120, 15);");" 这些都不起作用。
    • 调用 setStyleSheet 函数时不需要大括号:例如textbox-&gt;setStyleSheet("color:white; width:100px; height:50px;");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2011-09-20
    相关资源
    最近更新 更多