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() 不会刷新款式