Qt开发技术(Qt绘图系统QPainter详解)

满堂花醉三千客,一剑霜寒十四州。这篇文章主要讲述Qt开发技术:Qt绘图系统QPainter详解相关的知识,希望能为你提供帮助。




前话          红胖子,来也!
          Qt的图形绘制系统,本篇主要介绍绘图类QPainter。


绘图:QPainter类概述QPainter类在窗口和其他绘制设备上执行低级绘制。
QPainter提供高度优化的功能来完成大多数图形用户界面程序所需的工作。它能画出从简单线条到复杂形状如饼图和弦等一切图形。它还可以绘制对齐的文本和像素图。通常,它绘制一个“自然”坐标系,但它也可以进行视图和世界变换。QPainter可以对继承QPaintDevice类的任何对象进行操作。
QPainter的常见用法是在窗口的绘制事件中:构造和自定义(例如设置笔或画笔)绘制器。然后画。记住在绘制后销毁QPainer对象。例如:

QPainter的核心功能是绘图,但是类还提供了几个功能,允许您自定义QPainter的设置及其渲染质量,以及其他启用剪辑的功能。此外,还可以通过指定绘制者的合成模式来控制不同形状合并在一起的方式。
【Qt开发技术(Qt绘图系统QPainter详解)】函数QPainter::isActive()的作用是:指示绘制程序是否处于活动状态。painter由begin()函数和接受QPaintDevice参数的构造函数激活,end()函数和析构函数将停用它。
与QPaintDevice和QPaintEngine类一起,QPainter构成了qt绘图系统的基础。QPainter是用于执行绘图操作的类。QPaintDevice表示可以使用QPainter绘制的设备。QPaintEngine提供了一个接口,绘图使用它来绘制不同类型的设备。如果绘图处于活动状态,则device()返回及绘图在其上进行绘图的绘图设备,paintEngine()返回绘图当前正在使用的绘图引擎。有关详细信息,请参见绘图系统。
有时,要求在不通用的设备上作画。QPainer支持一个静态函数来执行此操作,setRedirected()。
警告:当paintdevice是一个窗口时,QPainter只能在paintEvent()函数或paintEvent()调用的函数中使用。
设置属性
可以根据自己的喜好自定义多个设置以使QPainer绘制:

  • font()用于绘制文本的字体。如果painter为isActive(),则可以分别使用fontInfo()和fontMetrics()函数检索有关当前设置的字体及其度量的信息。
  • brush()定义用于填充形状的颜色或图案。
  • pen()定义用于绘制线条或边界的颜色或点画。
  • backgroundMode()定义是否有background(),即它是Qt::OpaqueMode或Qt::TransparentMode。
  • background()是Qt::OpaqueMode,pen()是点画时,background()才适用。在这种情况下,它描述点画中背景像素的颜色。
  • brushOrigin()定义平铺画笔的原点,通常是小部件背景的原点。
  • viewport()、window()、worldTransform()构成了painter的坐标转换系统。有关详细信息,请参见“坐标变换”部分和坐标系文档。
  • hasClipping()告诉画师是否剪辑。(绘制设备也会被保存)如果painter被截取,它会被保存到clipRegion()。
  • layoutDirection()定义绘制文本时画家使用的布局方向。
  • worldMatrixEnabled()指示是否启用世界转换。
  • viewTransformEnabled()指示是否启用视图转换。
请注意,这些设置中的一些反映了某些绘制设备中的设置,例如QWidget::Font()。QPainter::begin()函数(或等效的QPainter构造函数)从绘制设备复制这些属性。
可以随时通过调用save()函数来保存QPainer的状态,该函数将所有可用的设置保存在一个内部堆栈上(入栈)。restore()函数的作用是:将它们恢复(出栈)。
绘制
QPainter提供了绘制大多数基本体的函数:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConverExpolygon()和drawCubicBezier()。drawRects()和drawLines()这两个函数使用当前的画笔在给定的QRects或QLines数组中绘制给定数量的矩形或线条。
QPainer类还提供了fillRect()函数,该函数用给定的QBrush填充给定的QRect,以及擦除给定矩形内区域的eraseRect()函数。
所有这些函数都有整数和浮点版本(推荐使用浮点数版本)。
绘制基础          测试对象为QWidget,重载paintEvent函数绘制,如下图:

文字:drawText

void Widget::drawText(QPainter *painter)

painter-> save();
painter-> drawText(rect(), Qt::AlignCenter, "Hello Qt!!!");
painter-> restore();

点:drawPoint,drawPoints

void Widget::drawPoint(QPainter *painter)

painter-> save();
painter-> drawPoint(10, 10);
QPoint point(20, 20);
painter-> drawPoint(point);
QPointF pointF(30, 30);
painter-> drawPoint(pointF);
painter-> restore();


void Widget::drawPoints(QPainter *painter)

painter-> save();
QPoint point[5];
point[0].setX(10);
point[0].setY(10);
point[1].setX(20);
point[1].setY(20);
point[2].setX(30);
point[2].setY(30);
point[3].setX(40);
point[3].setY(40);
point[4].setX(50);
point[4].setY(50);
painter-> drawPoints(point, 5);

QPolygon polypon;
polypon < < QPoint(10, 70);
polypon < < QPoint(20, 70);
polypon < < QPoint(30, 70);
polypon < < QPoint(40, 70);
polypon < < QPoint(50, 70);
polypon < < QPoint(60, 70);
painter-> drawPoints(polypon);

painter-> restore();

直线:drawLine,drawLines

void Widget::drawLine(QPainter *painter)

painter-> save();
QLine line(0, 0, 100, 100);
painter-> drawLine(line);
painter-> drawLine(0,100, 100, 0);
painter-> drawLine(QPoint(50, 0), QPoint(50, 100));
painter-> restore();


void Widget::drawLines(QPainter *painter)

QVector< QLine> vectorLine;
vectorLine < < QLine(10, 0, 10, 100);
vectorLine < < QLine(30, 0, 30, 100);
vectorLine < < QLine(50, 0, 50, 100);
vectorLine < < QLine(70, 0, 70, 100);
vectorLine < < QLine(90, 0, 90, 100);
painter-> drawLines(vectorLine);

折线:drawPolyline

void Widget::drawPolyline(QPainter *painter)

painter-> save();
QPoint point[5];
point[0].setX(10);
point[0].setY(10);
point[1].setX(20);
point[1].setY(10);
point[2].setX(40);
point[2].setY(40);
point[3].setX(40);
point[3].setY(60);
point[4].setX(50);
point[4].setY(50);
painter-> drawPolyline(point, 5);
QPolygon polypon;
polypon < < QPoint(10, 70);
polypon < < QPoint(20, 70);

    推荐阅读