Qt在对children调用show后,再设置objectname,objectname样式选择器定义的样式不生效

代码如下:

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QObject>
#include <QVBoxLayout>
#include <QWidget>

class Frame : public QWidget {
    Q_OBJECT
  public:
    Frame(QWidget* parent = nullptr) : QWidget(parent) {
        setAttribute(Qt::WA_StyledBackground);
        m_layout = new QVBoxLayout(this);

        m_content = new QWidget(this);
        m_content->setObjectName("Content");
        m_layout->addWidget(m_content);
    }
    void showContent() { m_content->show(); }

  private:
    QWidget* m_content;
    QVBoxLayout* m_layout;
};

class MainWindow : public QMainWindow {
  public:
    MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
        frame = new Frame(this);
        this->setCentralWidget(frame);

        frame->showContent();

        resize(600, 400);
        this->setObjectName("MainWindow");
    }

  private:
    Frame* frame;
};

#endif  // MAINWINDOW_H
//main.cpp
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char* argv[]) {
    QApplication a(argc, argv);

    qApp->setStyleSheet("Frame #Content{background-color:red;} #MainWindow Frame #Content{background-color:blue;}");

    MainWindow w;
    w.show();

    return a.exec();
}

按照样式设定,蓝色的样式匹配权重应高于红色,应该显示蓝色才对,但是实际上显示确是红色,如下图所示:

image.png

原因:

在容器设置objectName(MainWindow)之前,调用了Content的show函数,这会给Content设置Qt::WA_WState_ExplicitShowHide属性,源码如下:

image.png

image.png

然后调用容器的show函数时,进而调用showChildren,会根据WA_WState_ExplicitShowHide属性分别调用show_recursive和show,如下所示:

image.png

调用show_recursive()不会刷新样式


点墨
26 声望3 粉丝

全栈前端开发工程师