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 & );
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; };
virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void keyReleaseEvent( QKeyEvent * );