我使用的是Qt,5.9,Windows。 我在程序启动后尝试更改styleSheet属性,因此用户可以自定义程序的外观。
我还没有创建一个styleSheet文件。相反,在Qt的设计模式中,我转到我试图改变的元素的属性,单击" styleSheet"属性,并添加我要在Qt显示的窗口中更改的属性。 检查图像1 *作为示例。红色框显示我添加styleSheet属性的位置,绿色框显示我点击进入允许我添加styleSheet属性的弹出窗口的位置。
Image 2 *显示了当我以这种方式添加styleSheet属性时如何编写.ui代码。此处的红色框显示代码如何自动写入.ui文件。
在menuBar的编辑菜单中,我放置了一个名为" Appearance"的子菜单,其中包含一些预设的程序颜色选项以及一个自己定制程序的选项。 在图像3 *中,您可以看到菜单。
当用户单击其中一个颜色选项时,它应该更改程序的styleSheet属性,因此颜色与所选颜色相匹配。问题发生在这里。 图4显示了单击这些颜色选项的代码:
在红色方块中,我得到的错误以及产生错误的各个行。 在黄色广场上,我做了许多试验中的两个。 在蓝色方块,最看似有效的尝试。当我拍摄截图时,第21行中的那个没有被编译,但它只是在编译后抱怨(但它确实抱怨了!)。它说" notr"未在此范围内定义。所以我试着宣布它。 当我尝试" string notr"时,第22行中的那个给了我一个错误,说这个字符串没有在这个范围内定义。我把它包括在内,并将其改为" std :: string notr",但它仍在抱怨。就像你在红色框中看到的那样,它表示"在#not;''"之前预期的主要表达。
这是什么意思?我该如何解决这个问题,所以我可以更改元素的styleSheet属性? 我想过将styleSheet文件用于预先设置的颜色,但是如果可能的话,我想避免使用比所需更多的文件。此外,如果选项是预设的,用户将如何设置自定义样式表?
感谢您的关注和帮助。
P.S。:就像一个奖金问题。我首先尝试改变基本颜色,然后开始前进。 最终,我希望能够重现像物质外观和感觉,它处理颜色,制作渐变或给titleBar多种颜色的方式。有谁知道要走哪条路线?我相信styleSheets太弱了无法再现那些效果,所以我想知道我怎么能改变程序看起来更像Susbtance的皮肤。 再次感谢。
*图像1,2和3出现在同一图像文件中,因为StackOverflow不允许我发布超过2张图像。
答案 0 :(得分:1)
根据文档的函数setProperty()
:
将对象名称属性的值设置为value。
如果使用
Q_PROPERTY
在类中定义属性,则为true 成功后返回,否则为假。如果财产不是 使用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 "Arial";
color: rgb(220, 220, 220);<string>
</property>
notr="true"
表示当您想要使用Qt翻译系统时,不会考虑此字符串:No Translations。
编译器从不直接使用xml,它将.ui文件转换为.h文件,名称为ui_yourdesign.h。
setStyleSheet()
函数是QWidget的一部分,因此任何继承自QWidget
的类都可以使用它,即QMenubar,QLineEdit,QTextEdit。
例如您显示的xml:
显示theBar菜单正在应用于该属性,该指令可以通过C ++更改,并带有以下语句:
ui->menuBar->setStyleSheet("background-color: rgb (78, 78, 78); font 10pt; color: rgb(220, 220, 220);")
答案 1 :(得分:0)
您可以使用例如myPushButton->setStyleSheet("* { color: blue }");
来查看ui->menuBar->setStyleSheet("your style sheet properties");
ui->centralWidget->setStyleSheet("your style sheet properties");
或word-break: break-all
答案 2 :(得分:0)
假设您有一个名为“ 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);