现在的位置: 首页 > 综合 > 正文

Qwt源码解读之QwtPainter类

2013年09月02日 ⁄ 综合 ⁄ 共 1354字 ⁄ 字号 评论关闭

      QwtPainter类提供了QPainter类相关方法的集合,主要是对QPainter诸多方法的包装。

代码分析:

1)QwtPainter类定义了两个静态属性数据:

private:
    static bool d_polylineSplitting;
    static bool d_roundingAlignment;

 在cpp文件中对其进行了初始化:

bool QwtPainter::d_polylineSplitting = true;
bool QwtPainter::d_roundingAlignment = true;

2)属性值的set/get接口:

class QWT_EXPORT QwtPainter
{
public:
    static void setPolylineSplitting( bool enable);
    static bool polylineSplitting();
    static void setRoundingAlignment( bool enable);
    static bool roundingAlignment();
    static bool roundingAlignment(QPainter *);
    
    // ....
};

3)在cpp中定义了3个static inline 函数:

static inline bool isClippingNeeded( const QPainter *painter, QRectF &clipRect )
{
    bool doClipping = false;
    const QPaintEngine *pe = painter->paintEngine();
    if ( pe && pe->type() == QPaintEngine::SVG )
    {
        // The SVG paint engine ignores any clipping,
        if ( painter->hasClipping() )
        {
            doClipping = true;
            clipRect = painter->clipRegion().boundingRect();
        }
    }
    return doClipping;
}

关于 static inline 函数:

a)static 指定了该接口的作用域仅限在当前源文件中使用。也就是说,如果我们封装的接口只会在某一个源文件(或只有自己)用到时,那么应该将其定义在该源文件中,并声明为“静态全局函数” 。这其实一种信息隐藏。那么,为什么这种隐藏是有用的?因为这些函数为了统一接口,大家都需要实现这个接口(例如greaterThan()等),如果不用static,就很有可能重名。从而导致编译出错。

b) inline 建议编译器对该函数使用内联展开。可是,不是说内联函数只能定义在头文件中吗?求解!

刚百度了一下,有位大侠的说法不错(但不知道是不是只是标准C的情况):

【static inline 的内联函数,一般情况下不会产生函数本身的代码,而是全部被嵌入在被调用的地方。如果不加static,则表示该函数有可能会被其他编译单元所调用,所以一定会产生函数本身的代码。所以加了static,一般可令可执行文件变小。内核里一般见不到只用inline的情况,而都是使用static inline。 】

原文链接:

http://blog.chinaunix.net/uid-26285146-id-3225668.html

抱歉!评论已关闭.