我有一个QFrame,标题为'bannerframe'嵌入在对话框中,与其他小部件一起使用。
我想动态更改框架的背景。如果我使用顶级对话框(MessageDlg)中定义的样式表,它会正确显示,如下所示: -
样式表定义为
#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小部件,则渐变似乎无法正常工作: -
无论在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上而不是顶层对话框上时,为什么渐变在框架的小部件周围不能正常工作?
答案 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。