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