QT开发(十四)——QT绘图系统

一、QT绘图原理

    Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter、QPainterDevice和 QPainterEngine。QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口。QPainter用来执行具体的绘图相关操作如画点,画线,填充,变换,alpha通道等。QPaintDevice类是能够进行绘图的对象的基类,QWidget,QPixmap,QPicture,QImage,以及QPrinter类继承了QPaintEngine类的绘图能力QPainter类可以在一切继承QPainterDevice的子类上进行绘制操作。

    QT中Arthur绘图框架中的基本绘图元素是画笔,画刷。
    QPainter类具有GUI程序需要的绝大多数函数,能够绘制基本图形(点,线,矩形,多边形等)以及复杂的图形(如绘图路径)使用绘图路径(QPaintPath)的优点是复杂形状的图形只用生成一次,再使用的时候只需要调用QPainter::drawPath()就可以绘制。QPainterPath对象可以用来填充,绘制轮廓。
    线和轮廓都可以用画笔(QPen)进行绘制,画刷(QBrush)进行填充。画笔定义风格(线形),宽度,笔尖画刷以及端点是如何绘制的(cap-style),端点的连接方式(join-style)画刷用来填充画笔绘制的图形,可以定制不同的填充模式和颜色的画刷。
当绘制文字时,字体使用QFont类定义,Qt使用指定字体的属性,如果没有匹配的字体,Qt将使用最接近的字体。字体属性可以通过QFontInfo来获取。字体的度量(measurement)使用QFontMetrics类来获取。QFontDatabase类可以获得底层窗口系统所有可用的字体

    通常情况下QPainter以默认的坐标系统进行绘制,也可以用QMatrix类对坐标进行变换。
    当绘制时,可以使用QPainter::SetRenderHint函数设置绘图引擎是否启用锯齿功能使图变得平滑。

    QPainter::Antialiasing可能进行边的反锯齿绘制
    QPainter::TextAntialiasing       尽可能进行文字的反锯齿绘制
    QPainter::SmoothPixmapTransform  使用平滑的pixmap变换算法(双线性插值算法),而不是近邻插值算法

1、重写重绘事件处理函数实现绘图

重绘事件处理函数:

    void QWidget::paintEvent ( QPaintEvent * event )

    基础部件类Qwidget提供的paintEvent函数,是虚函数;Qwidget的子类要使用paintEvent函数必须重新实现。三种情况会发生重绘事件调用paintEvent函数:

    A、当窗口部件第一次显示时,系统会自动产生一个绘图事件

    B、repaint()与update()函数被调用时

    C、当窗口部件被其他部件遮挡,然后又再次显示出来时,就会对隐藏的区域产生一个重绘事件

    D、重新调整窗口大小时

2、通过事件过滤器实现重绘

 

 

二、绘图工具

    绘图时需要先定义一个QPainter类对象,绘图工具可以使Qpen(画笔)QBrush(画刷)Qpen(画笔)来绘制轮廓线QBrush(画刷)用来填充,使用QPen写文本时还可以指定字体(QFont类)

1、QPen画笔

画笔的属性包括线型,线宽,颜色等。

A、QPen主要成员函数如下:

    QPen(Qt::PenStyle style)

    QPen(const QColor & color)

    QPen(const QBrush & brush, qreal width, Qt::PenStyle style = Qt::SolidLine,     Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin)

    QPen(const QPen & pen)

    void setBrush(const QBrush & brush)

    void setCapStyle (Qt::PenCapStyle style)

    void setColor (const QColor & color)

    void setJoinStyle (Qt::PenJoinStyle style)