Qwt源码解读之QwtText类和QwtTextLabel类

QwtText类表征Qwt中的一段文本。与QString相比,QwtText包含了一系列怎样渲染文本的属性特征。通过指定这些属性,你可以绘制各种各样的文本样式。

代码分析:

1、接口示例:

    double heightForWidth( double width, const QFont & = QFont() ) const;  // 根据指定的宽度给出最合适的高度
    QSizeF textSize( const QFont & = QFont() ) const;

    void draw( QPainter *painter, const QRectF &rect ) const; // 在一个矩形里绘制文本内容
    static const QwtTextEngine *textEngine( 
        const QString &text, QwtText::TextFormat = AutoText );

    static const QwtTextEngine *textEngine( QwtText::TextFormat );
    static void setTextEngine( QwtText::TextFormat, QwtTextEngine * );

double heightForWidth( double width, const QFont & = QFont() ) const;   heightForWidth() 一个好的接口命名示例。

2、构造函数:

/*!
   Constructor

   \param text Text content
   \param textFormat Text format
*/
QwtText::QwtText( const QString &text, QwtText::TextFormat textFormat )
{
    d_data = new PrivateData;
    d_data->text = text;
    d_data->textEngine = textEngine( text, textFormat );

    d_layoutCache = new LayoutCache;
}

3、拷贝构造函数:

//! Copy constructor
QwtText::QwtText( const QwtText &other )
{
    d_data = new PrivateData; // 分配内存空间
    *d_data = *other.d_data;  // 赋值

    d_layoutCache = new LayoutCache; // 分配内存空间
    *d_layoutCache = *other.d_layoutCache;  // 赋值
}

4、拷贝赋值操作符函数:

//! Assignment operator
QwtText &QwtText::operator=( const QwtText & other )
{
    *d_data = *other.d_data;
    *d_layoutCache = *other.d_layoutCache;
    return *this;
}

5、析构函数:

//! Destructor
QwtText::~QwtText()
{
    delete d_data;
    delete d_layoutCache;
}

6、“文本引擎”访问接口:

/*!
   \brief Find the text engine for a text format

   textEngine can be used to find out if a text format is supported.

   \param format Text format
   \return The text engine, or NULL if no engine is available.
*/
const QwtTextEngine *QwtText::textEngine( QwtText::TextFormat format )
{
    return  QwtTextEngineDict::dict().textEngine( format );
}

共有两个“文本引擎”访问接口,我们仅举带一个参数的接口作为例子。

7、QwtTextEngineDict类:文本引擎字典类,用于根据文本格式查询文本引擎。

class QwtTextEngineDict
{
public:
    static QwtTextEngineDict &dict(); // 单例模式

    void setTextEngine( QwtText::TextFormat, QwtTextEngine * );

    const QwtTextEngine *textEngine( QwtText::TextFormat ) const;
    const QwtTextEngine *textEngine( const QString &,
        QwtText::TextFormat ) const;

private:
    QwtTextEngineDict(); // 构造函数,声明为私有的
    ~QwtTextEngineDict();

    typedef QMap<int, QwtTextEngine *> EngineMap; 

    inline const QwtTextEngine *engine( EngineMap::const_iterator &it ) const // 将it.value();封装为一个函数,一为了方便;二使代码可读
    {
        return it.value();
    }

    EngineMap d_map; // 工厂模式,在构造函数中即被初始化
};

QwtTextEngineDict &QwtTextEngineDict::dict()
{
    static QwtTextEngineDict engineDict; //  单例模式,对象只会被创建一次
    return engineDict; // 返回对象的引用
}

QwtTextEngineDict::QwtTextEngineDict()
{
    d_map.insert( QwtText::PlainText, new QwtPlainTextEngine() );
#ifndef QT_NO_RICHTEXT
    d_map.insert( QwtText::RichText, new QwtRichTextEngine() );
#endif
}

QwtTextEngineDict::~QwtTextEngineDict() // 析构函数
{
    for ( EngineMap::const_iterator it = d_map.begin();
        it != d_map.end(); ++it )
    {
        const QwtTextEngine *textEngine = engine( it );
        delete textEngine;
    }
}

--------------------------------------

QwtTextLabel类: 一个用于显示QwtText的窗体部件(QWidget),继承自QFrame。QwtTextLabel类的实现不难,是一个很好的教学示例,告诉我们如何自定义自己的控件。

主要通过

代码分析:

1、设置缩进:

/*!
  Set label's text indent in pixels
  \param indent Indentation in pixels
*/
void QwtTextLabel::setIndent( int indent )
{
    if ( indent < 0 ) // 防错性设计,增强健壮性
        indent = 0;

    d_data->indent = indent;

    update();
    updateGeometry();
}
2、重新实现“窗体部件大小”的接口:

    virtual QSize sizeHint() const;
    virtual QSize minimumSizeHint() const;
    virtual int heightForWidth( int ) const;
3、绘制窗体形状和样式:
protected:
    virtual void paintEvent( QPaintEvent *e );
    virtual void drawContents( QPainter * );
    virtual void drawText( QPainter *, const QRect & );


--------------------------------------
QwtLegendItem类继承自QwtTextLabel,表征QwtLegend列表部件中的一个子项目,其包含一个示例图QPixmap(被称作identifier)和一个文本名称QwtText。QwtLegendItem具有只读(ReadOnlyItem),可点击(ClickableItem)和可选中(CheckableItem)等3种状态。除了重新实现了绘制事件函数外,还重新实现了鼠标事件函数。

1、属性数据:

class QwtLegendItem::PrivateData
{
public:
    PrivateData():
        itemMode( QwtLegend::ReadOnlyItem ),
        isDown( false ),
        identifierSize( 8, 8 ),
        spacing( Margin )
    {
    }

    QwtLegend::LegendItemMode itemMode;
    bool isDown;

    QSize identifierSize; // 图示大小
    QPixmap identifier; // 图示

    int spacing;
};

2、重新实现的虚函数:

    virtual void paintEvent( QPaintEvent * );
    virtual void mousePressEvent( QMouseEvent * );
    virtual void mouseReleaseEvent( QMouseEvent * );
    virtual void keyPressEvent( QKeyEvent * );
    virtual void keyReleaseEvent( QKeyEvent * );







  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值