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 * );