C++ 如何在运行时更改样式表属性?
我正在使用Qt、5.9和Windows。 我试图在程序启动后更改样式表属性,以便用户可以自定义程序的外观 我还没有创建样式表文件。相反,在Qt的设计模式中,我转到我试图更改的元素的属性,单击“样式表”属性,并在Qt显示的窗口中添加我想要更改的属性。 检查图像1*以了解示例。红色框显示我添加样式表属性的位置,绿色框显示我单击以进入允许我添加样式表属性的弹出窗口的位置 图2*显示了以这种方式添加样式表属性时.ui代码的编写方式。这里的红色框显示了如何在.ui文件中自动编写代码 在菜单栏的编辑菜单中,我放置了一个名为“外观”的子菜单,其中有一些预设的程序颜色选项和一个自定义程序的选项。 在图3*中,您可以看到菜单 当用户单击其中一个颜色选项时,它应该更改程序的样式表属性,以便颜色与所选颜色匹配。问题就发生在这里。 图4显示了单击这些颜色选项的代码: 在红场中,我得到的错误,以及产生这些错误的相应行。 在黄色的广场上,我做了很多试验中的两个。 在蓝色广场,似乎最有效的尝试。第21行中的那个在我截图时没有被编译,但它只是在编译之后才抱怨(但它确实抱怨了!)。它说“notr”不在此范围内定义。所以我试着申报。 当我尝试“stringnotr”时,第22行中的一个给了我一个错误,说这个字符串没有在这个范围内定义。我包含了,并将其更改为“std::string notr”,但它仍然在抱怨。正如您在红色框中看到的,它表示“在'notr'之前预期的主表达式” 这是什么意思?如何解决这个问题,以便更改元素的样式表属性? 我曾想过使用样式表文件作为预设颜色,但如果可能的话,我希望避免使用比需要更多的文件。另外,如果选项是预先设置的,用户如何设置自定义样式表 谢谢你的关注和帮助 附言:这是一个额外的问题。我试着先改变基本颜色,然后开始前进。 最终,我希望能够重现一些东西,比如物质的外观和感觉,它处理颜色的方式,渐变,或者给标题栏多个颜色。有人知道该走哪条路吗?我相信样式表太弱了,无法再现这些效果,所以我想知道如何才能改变程序,使其看起来更像Susbtance的皮肤。 再次感谢C++ 如何在运行时更改样式表属性?,c++,qt,qt5,qt-designer,qtstylesheets,C++,Qt,Qt5,Qt Designer,Qtstylesheets,我正在使用Qt、5.9和Windows。 我试图在程序启动后更改样式表属性,以便用户可以自定义程序的外观 我还没有创建样式表文件。相反,在Qt的设计模式中,我转到我试图更改的元素的属性,单击“样式表”属性,并在Qt显示的窗口中添加我想要更改的属性。 检查图像1*以了解示例。红色框显示我添加样式表属性的位置,绿色框显示我单击以进入允许我添加样式表属性的弹出窗口的位置 图2*显示了以这种方式添加样式表属性时.ui代码的编写方式。这里的红色框显示了如何在.ui文件中自动编写代码 在菜单栏的编辑菜单中,
*图像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 "Arial";
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);