设置QFrame的样式

Setting the style of QFrame

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

我想动态改变相框的背景。如果我使用顶层对话框 (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 小部件,渐变似乎无法正常工作:-

无论在设计器中还是在代码中设置样式表,都会看到相同的效果:

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

那么,这是怎么回事?

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

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

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

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

我也不得不处理这个问题,直到我发现 Qt 样式是由设置样式的最后一行决定的。这意味着如果你有

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

只有样式 3 会保留(如果它们相等但值在变化。如果存在差异,即 style1 将文本设为粗体,而 style2 将文本设为 14 号,它们都可以工作,但如果 style3 表示文本大小为17,那就17了。

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

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

喜欢:

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

只有 LineEdits 才会有那个背景。在您的情况下,您只需要根据需要使用 QFrame 或 QFrame#bannerFrame。