乐趣区

关于qt:Qt-设置objectname样式不生效

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

退出移动版