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()不会刷新样式
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。