简介: Qt 的 proxy() 代理函数探究

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


查看源码:

qt中源码查阅可看到:

/*!
    \since 4.6

    \fn const QStyle *QStyle::proxy() const

    This function returns the current proxy for this style.
    By default most styles will return themselves. However
    when a proxy style is in use, it will allow the style to
    call back into its proxy.
*/
const QStyle * QStyle::proxy() const
{
    Q_D(const QStyle);
    return d->proxyStyle;
}

问题起因:

在封装函数的时候,
int radius = proxy()->pixelMetric(PM_FrameRadius, opt, w); //为什么这里使用proxy()->会显示报错,没有匹配到的相应的函数
// int radius = DStyle::pixelMetric(PM_FrameRadius, opt, w);     //而下面的可以通过


分析

检索 Qt 帮助手册:pixelMetric;发现一共有如下QStyle–>QCommonStyle–>QProxyStyle (只有这三个,依次为重写上一个)

int QStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const

int QCommonStyle::pixelMetric(QStyle::PixelMetric m, const QStyleOption *opt = nullptr, const QWidget *widget = nullptr) const

int QProxyStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const

int DStyle::pixelMetric(QStyle::PixelMetric m, const QStyleOption *opt = nullptr, const QWidget *widget = nullptr) const override;


解惑

然而,上面的分析实际上,并没有什么卵用,用下面一句话解决:

proxy()实际上就是返回它自己,相当于当前类的this指针;通过自己实际工程中的验证,也的确是这样这理解

其源码英文的注释翻译如下:

此函数返回此样式的当前代理。 默认情况下,大多数样式都会返回。 然而当使用代理样式时,它将允许样式回调它的代理.