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

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

起因:

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

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

调用show_recursive()不会刷新款式