C++ 如何在运行时更改样式表属性?

C++ 如何在运行时更改样式表属性?,c++,qt,qt5,qt-designer,qtstylesheets,C++,Qt,Qt5,Qt Designer,Qtstylesheets,我正在使用Qt、5.9和Windows。 我试图在程序启动后更改样式表属性,以便用户可以自定义程序的外观 我还没有创建样式表文件。相反,在Qt的设计模式中,我转到我试图更改的元素的属性,单击“样式表”属性,并在Qt显示的窗口中添加我想要更改的属性。 检查图像1*以了解示例。红色框显示我添加样式表属性的位置,绿色框显示我单击以进入允许我添加样式表属性的弹出窗口的位置 图2*显示了以这种方式添加样式表属性时.ui代码的编写方式。这里的红色框显示了如何在.ui文件中自动编写代码 在菜单栏的编辑菜单中,

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

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

图2*显示了以这种方式添加样式表属性时.ui代码的编写方式。这里的红色框显示了如何在.ui文件中自动编写代码

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

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

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

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

谢谢你的关注和帮助

附言:这是一个额外的问题。我试着先改变基本颜色,然后开始前进。 最终,我希望能够重现一些东西,比如物质的外观和感觉,它处理颜色的方式,渐变,或者给标题栏多个颜色。有人知道该走哪条路吗?我相信样式表太弱了,无法再现这些效果,所以我想知道如何才能改变程序,使其看起来更像Susbtance的皮肤。 再次感谢


*图像1、2和3显示在同一个图像文件中,因为StackOverflow不允许我发布超过2个图像。

您可以使用例如
mybutdown->setStyleSheet(“*{color:blue}”)看看你的例子,它是
ui->menuBar->setStyleSheet(“你的样式表属性”)
ui->centralWidget->setStyleSheet(“您的样式表属性”)

根据文档对功能进行编码:

将对象的name属性的值设置为value

如果属性是在类中使用
Q\u属性定义的,则为true
成功返回,否则返回false。如果该属性不是
使用
Q_属性定义,因此未列在元对象中,
它作为动态属性添加,并返回false

也就是说,属性必须在具有该宏的类中定义,但样式表不满足这些要求,因此您将无法使用该方法访问

要动态更改该属性,必须使用。例如,在您的案例中:

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
    ,您必须使用

  • 指令
    some_函数(类型_变量名_变量=some_值)不是有效的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>

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

centralWidget()->setStyleSheet(“您的样式表属性”)中如何编写“您的样式表属性”?我尝试过(以背景色为例)
“{background color:rgb(250,120,15);}”
“background color:rgb(250,120,15);”
“centralWidget()->setProperty”(“样式表”,“背景色:rgb(250,120,15);”)
这些都不起作用。调用setStyleSheet函数时不需要花括号:例如
textbox->setStyleSheet(“颜色:白色;宽度:100px;高度:50px;”
有些事情你说我知道,有些事情我没有想到(特别是
一些函数(键入变量名\u variable=Some\u value);
,不知道如何传递
std::string=“string”
)。无论如何,这是一个多么完整的答案啊!非常感谢。您必须转换为QString:
std::string s=“some_text”;QString QString=QString::fromUtf8(s.c_str());centralWidget()->setStyleSheet(qstring)。我建议对Qt使用本机数据类型。上面的内容简化为:
QString QString=“some_text”;centralWidget()->setStyleSheet(qstring),如果我们使用Qt的本机类型。所有CSS都与Qt样式表不兼容,即CSS不等于QSS,有关更多信息,请阅读以下内容:没有工作(顺便说一下,这是我尝试过的事情之一)。是否需要调用任何函数来“更新”样式表,或再次渲染它(我尝试了repaint()、render()、setVisible(false)和setVisible(true))?它看起来像是一个旧问题的副本,得到了一个很好的答案:
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);