QT 顶级窗口为QWidget 设置顶级窗口背景无效

    xiaoxiao2022-07-02  105

    今天同事遇到一个问题,就是一个很简单的demo。使用Designer创建了一个顶层窗口QWidget,然后右键设置样式表,将背景设置为红色。这时候看起来一切正常,但是运行起来的时候,背景居然没有更改,也就是设置的CSS样式表并没有生效。

    先看一下问题:

    1.创建一个叫Form的QWidget窗口。

    2.右键设置样式表

    #Form { background:red; }

    这时候看起来一切正常:

    3.在main函数进行显示

    Form w; w.show();

    结果却是这样的:


    设置了样式表,运行的时候却没生效?是的,结果就是这样的!我们来探究一下为什么会这样?有下面几条结论:

    对于顶层窗口,在Designer中设置的背景样式表默认是不生效的。如果设置了顶层窗口的背景 样式表,怎样才能生效呢? 就是在顶层窗口的构造函数中设置属性: setAttribute(Qt::WA_StyledBackground);

    这个属性什么意思呢?我们查阅帮助文档得知,意思就是告诉窗口,应该使用设置的样式表进行渲染控件背景:

    设置完后,我们在Designer中设置的关于背景的样式表就会生效:

    但是,我们并不建议直接对顶层窗口在Designer中使用样式表,进行背景设置:

    原因是:如果顶层窗口设置了窗口背景,若子控件不使用同样的方式来设置样式表,则所有子控件默认继承了顶层窗口的背景。

    我们做个例子,在Form的控件上,拖上几个子控件,并不设置子控件的样式表:

     

    执行之后的效果呢?

    结论:也就说,所有的子控件如果不指定各自的样式表,将默认继承顶层窗口的背景。

     

    究竟怎样才能设置一个顶层窗口的背景呢?

    方式一:就是上面我们提到的,在Designer中直接指定背景样式表。并在构造函数设置属性:

    setAttribute(Qt::WA_StyledBackground);

    方式二:在构造函数中使用代码设置样式表

    setStyleSheet("background-color:red");

     

    方式三:使用QPalette:

    m_pWidget = new QWidget(this); m_pWidget->setGeometry(0, 0, 300, 100); QPalette pal(m_pWidget->palette()); //设置背景黑色 pal.setColor(QPalette::Background, Qt::red); m_pWidget->setAutoFillBackground(true); m_pWidget->setPalette(pal); m_pWidget->show();

    方式四:继承QPaintEvent事件,进行绘图:

    void Widget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter p(this); p.setPen(Qt::NoPen); p.setBrush(Qt::red); p.drawRect(rect()); }

     

    最新回复(0)