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)
voidsetBrush(const QBrush & brush)
voidsetCapStyle (Qt::PenCapStyle style)
voidsetColor (const QColor & color)
voidsetJoinStyle (Qt::PenJoinStyle style)
voidsetWidth (int width)
画笔的属性可以在构造函数中指定,也可以使用setStyle(),setWidth(),setBrush(),setCapStyle(),setJoinStyle()等函数设定画笔的各项属性。Qt中使用Qt::PenStyle定