Qt样式表 - 未应用的背景属性

FlK*_*lKo 6 css c++ qt qt-creator qt5

我正在尝试使用Qt DesignerQt Creator中创建一个自定义窗口小部件(本身包含一些子窗口小部件).

在设计器中,我将派生对象的styleSheet属性设置为ControlBar以下值:

QWidget{
    font-family: "Segoe UI";
    font-size: 9;
}
QWidget#ControlBar{
    background-color: #3a3a3a;
    border-width: 5px;
    border-radius: 4px;
    border-style: solid;
    border-color: #ffffff;
}
Run Code Online (Sandbox Code Playgroud)

现在,在设计师和预览模式(Shift + Alt + R)中,一切看起来都很好.

我现在的目的是ControlBar在运行时创建一个实例并将其分配给实例的主垂直布局MainWindow:

MainWindow::MainWindow(QWidget *parent)
:   QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ControlBar *controlBar = new ControlBar;
    ui->verticalLayout->insertWidget(0, controlBar);
}
Run Code Online (Sandbox Code Playgroud)

尽管样式按照ControlBar的每个子窗口小部件的预期工作,但给定的背景颜色(特别是's styleSheet 的background-color属性ControlBar)不会应用于控件栏,以及所有其他与背景相关的属性.相反,使用了背景颜色和样式MainWindow,而所有与子窗口小部件相关的样式都按预期工作.

我怎样才能摆脱这种行为并使其ControlBar具有预期的背景颜色?

Ste*_*low 6

QWidget#ControlBar指任何具有对象名称"ControlBar"的窗口小部件.

  1. 您的窗口小部件没有该对象名称.
  2. 由于某些原因,当对象名称与类名相同时,这似乎不起作用,除非对象是根对象.

因此它在设计师和预览中起作用,但不是作为其他东西的孩子.

要解决这个问题,请使用

ControlBar{
    background-color: #3a3a3a;
}
Run Code Online (Sandbox Code Playgroud)

反而,确保继承ControlBarQFrame,而不是形成QWidget.如果由于某种原因你不能,你必须覆盖paintEvent.请参阅此答案以获取确切的代码.

  • 非常感谢.继承QFrame而不是QWidget就行了. (2认同)