如何在运行时更改styleSheet属性?

时间:2017-08-05 15:17:06

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

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

我还没有创建一个styleSheet文件。相反,在Qt的设计模式中,我转到我试图改变的元素的属性,单击" styleSheet"属性,并添加我要在Qt显示的窗口中更改的属性。 检查图像1 *作为示例。红色框显示我添加styleSheet属性的位置,绿色框显示我点击进入允许我添加styleSheet属性的弹出窗口的位置。

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

在menuBar的编辑菜单中,我放置了一个名为" Appearance"的子菜单,其中包含一些预设的程序颜色选项以及一个自己定制程序的选项。 在图像3 *中,您可以看到菜单。

Images 1, 2 and 3, respectively.

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

Color options commands

在红色方块中,我得到的错误以及产生错误的各个行。 在黄色广场上,我做了许多试验中的两个。 在蓝色方块,最看似有效的尝试。当我拍摄截图时,第21行中的那个没有被编译,但它只是在编译后抱怨(但它确实抱怨了!)。它说" notr"未在此范围内定义。所以我试着宣布它。 当我尝试" string notr"时,第22行中的那个给了我一个错误,说这个字符串没有在这个范围内定义。我把它包括在内,并将其改为" std :: string notr",但它仍在抱怨。就像你在红色框中看到的那样,它表示"在#not;''"之前预期的主要表达。

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

感谢您的关注和帮助。

P.S。:就像一个奖金问题。我首先尝试改变基本颜色,然后开始前进。 最终,我希望能够重现像物质外观和感觉,它处理颜色,制作渐变或给titleBar多种颜色的方式。有谁知道要走哪条路线?我相信styleSheets太弱了无法再现那些效果,所以我想知道我怎么能改变程序看起来更像Susbtance的皮肤。 再次感谢。

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

3 个答案:

答案 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 &quot;Arial&quot;;
 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:

enter image description here

显示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);