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

时间:2017-10-22 18:40:48

标签: c++ css qt qt5 qt-creator

我尝试使用 Qt Designer Qt Creator 中创建自定义窗口小部件(本身包含一些子窗口小部件)。

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

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

现在设计师和预览模式( 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);
}

虽然样式按照预期为 ControlBar 的每个子窗口小部件工作,但给定的背景颜色(ControlBar&#的背景颜色属性39;特别是s styleSheet)不适用于控制栏,以及所有其他与背景相关的属性。相反,使用了MainWindow的背景颜色和样式,而所有与子窗口小部件相关的样式都按预期工作。

如何摆脱这种行为并让ControlBar拥有预期的背景颜色?

1 个答案:

答案 0 :(得分:6)

QWidget#ControlBar指的是对象名称为“ControlBar”的任何窗口小部件。

  1. 您的窗口小部件没有该对象名称。
  2. 由于某些原因,当对象名称与类名相同时,这似乎不起作用,除非对象是根对象。
  3. 因此它在设计师和预览中起作用,但不是其他东西的孩子。

    要解决此问题,请使用

    ControlBar{
        background-color: #3a3a3a;
    }
    

    而是确保从ControlBar继承QFrame而不是QWidget。如果由于某种原因你不能,则必须覆盖paintEvent。有关确切代码,请参阅this answer