设置QFrame的样式

时间:2015-07-22 13:30:18

标签: qt qt-creator

我有一个QFrame,标题为'bannerframe'嵌入在对话框中,与其他小部件一起使用。

我想动态更改框架的背景。如果我使用顶级对话框(MessageDlg)中定义的样式表,它会正确显示,如下所示: -

Correct gradient

样式表定义为

#bannerFrame
{
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, 
                                    stop:0 rgba(195, 40, 9, 255), 
                                    stop:0.7 rgba(225, 121, 113, 255), 
                                    stop:1 rgba(237, 154, 152, 255));
}

但是,如果我删除此项并将样式直接添加到bannerframe小部件,则渐变似乎无法正常工作: -

Bad gradient

无论在Designer中还是在代码中设置样式表,都可以看到相同的效果:

QString style = QString("background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0,\
                           stop:0 rgba(%1, %2, %3, 255),\
                           stop:1 rgba(%4, %5, %6, 255));").arg(red1).arg(green1).arg(blue1).arg(red2).arg(green2).arg(blue2);

ui->bannerFrame->setStyleSheet(style);

那么,这里发生了什么?

当样式表直接设置在Frame上而不是顶层对话框上时,为什么渐变在框架的小部件周围不能正常工作?

2 个答案:

答案 0 :(得分:1)

这可能是因为框架中的小部件将继承其父级样式表。所以你看到的是QLabel小部件,其图标具有渐变背景。添加选择器以限制样式应适用的小部件。

QString style = QString("QFrame {...}");

QString style = QString("QFrame#bannerFrame {...}");

答案 1 :(得分:1)

我也必须处理这个问题,直到我发现Qt风格由设定风格的最后一行决定。这意味着,如果你有

something->setStyleSheet(Style1);
something->setStyleSheet(Style2);
something->setStyleSheet(Style3);

只保留样式3(如果它们相等但更改值。如果存在差异,即style1将文本放在Bold中,style2将文本放入大小为14,则它们都将起作用但是如果style3表示文本大小为17,然后它将是17。

为了避免这种情况并且能够为每种类型的小部件更改它,您需要定义该样式的对象:

generallayout->setStyleSheet("NAME{css_code}");

像:

 myLayout->setStyleSheet("QLineEdit{background-color:#ff0066"}; 

只有LineEdits将具有该背景。在您的情况下,您只需要根据需要使用QFrame或QFrame#bannerFrame。