Qt Style And Style Sheet

简介: Qt Style And Style Sheet

QStyleSheetStyle 调用 QCss::Parser 解析qss样式,


那什么时候这些样式起作用呢?


每个QWidget子类对象绘制都会调用其 paintEvent(),而在 paintEvent中会调用这些样式进行绘制,如:QPushButton中


void QPushButton::paintEvent(QPaintEvent *) {
    QStylePainter p(this);
    QStyleOptionButton option;
    initStyleOption(&option);
    p.drawControl(QStyle::CE_PushButton, option);
}

QStyleOptionButton 会从QPushButton对象中获取相应的信息来初始化自己。drawControl内部会调用一系列接口根据样式绘制自己。

每个QWidget调用setStyleSheet方法设置样式,都会新建一个QStyleSheetStyle,其继承QWindowsStyle类,绘制由QStyle及其子类完成,而QStyleSheetStyle重载基类的绘制控件的方法

class QStyleSheetStyle : public QWindowsStyle
{
    typedef QWindowsStyle ParentStyle;
 
    Q_OBJECT
public:
    QStyleSheetStyle(QStyle *baseStyle);
    ~QStyleSheetStyle();
 
    void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p,
                            const QWidget *w = 0) const Q_DECL_OVERRIDE;
    void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p,
                     const QWidget *w = 0) const Q_DECL_OVERRIDE;
    void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const Q_DECL_OVERRIDE;
    void drawItemText(QPainter *painter, const QRect& rect, int alignment, const QPalette &pal,
              bool enabled, const QString& text, QPalette::ColorRole textRole  = QPalette::NoRole) const Q_DECL_OVERRIDE;
    void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p,
                       const QWidget *w = 0) const Q_DECL_OVERRIDE;
 
    ...
 
}
 
void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter *p,
                          const QWidget *w) const
{
    RECURSION_GUARD(baseStyle()->drawControl(ce, opt, p, w); return)
 
    QRenderRule rule = renderRule(w, opt);
    int pe1 = PseudoElement_None, pe2 = PseudoElement_None;
    bool fallback = false;
 
    switch (ce) {
    case CE_ToolButtonLabel:
        if (const QStyleOptionToolButton *btn = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
            if (rule.hasBox() || btn->features & QStyleOptionToolButton::Arrow) {
                QCommonStyle::drawControl(ce, opt, p, w);
            } else {
                QStyleOptionToolButton butOpt(*btn);
                rule.configurePalette(&butOpt.palette, QPalette::ButtonText, QPalette::Button);
                baseStyle()->drawControl(ce, &butOpt, p, w);
            }
            return;
        }
        break;
 
    ...
 
}

从上面代码,可以看出qss是通过以上方式起效的。

附:QStyle子类间的关系

 

目录
相关文章
|
4月前
|
前端开发 搜索推荐 API
【Qt 学习笔记】QWidget的styleSheet属性 | RGB | 在线调色板
【Qt 学习笔记】QWidget的styleSheet属性 | RGB | 在线调色板
258 5
Qt-QML-Slider-滑块-Style-后继
首先了,先把我上篇文章的demo准备好,不过我上次写的被我删除了,这次就重新写了一个,上代码
352 0
Qt-QML-Slider-滑块-Style-后继
|
自然语言处理
Qt-QML-Slider-滑块-Style
感觉滑块这个东西,可以算是一个基本模块了,在我的项目中也有这个模块,今天我将学一下一下滑块的使用以及美化工作。
393 0
Qt-QML-Slider-滑块-Style
Qt-QML-Charts-ChartView-编译错误-ASSERT: “!“No style available without QApplication!
昨天本来是回家想好好琢磨一下使用Chart来绘制曲线的,奈何在建立项目的时候也就卡住了,加上心情比较烦躁,也没有耐心寻找答案就草草了事。所以今天继续搞定这个。
363 0
Qt-QML-Charts-ChartView-编译错误-ASSERT: “!“No style available without QApplication!
Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
813 0
Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
超简单!Qt Designer插入图片,styleSheet加入图片,Qt加入背景图片
超简单!Qt Designer插入图片,styleSheet加入图片,Qt加入背景图片
632 0
超简单!Qt Designer插入图片,styleSheet加入图片,Qt加入背景图片
|
Python
PyQt5 技术篇 - Qt Designer怎么用styleSheet设置按钮的背景
PyQt5 技术篇 - Qt Designer怎么用styleSheet设置按钮的背景
641 0
PyQt5 技术篇 - Qt Designer怎么用styleSheet设置按钮的背景