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

Posted 长沙红胖子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt开发技术:Qt绘图系统QPainter详解相关的知识,希望对你有一定的参考价值。



前话

      红胖子,来也!

      Qt的图形绘制系统,本篇主要介绍绘图类QPainter。


绘图:QPainter类

概述

QPainter类在窗口和其他绘制设备上执行低级绘制。

QPainter提供高度优化的功能来完成大多数图形用户界面程序所需的工作。它能画出从简单线条到复杂形状如饼图和弦等一切图形。它还可以绘制对齐的文本和像素图。通常,它绘制一个“自然”坐标系,但它也可以进行视图和世界变换。QPainter可以对继承QPaintDevice类的任何对象进行操作。

QPainter的常见用法是在窗口的绘制事件中:构造和自定义(例如设置笔或画笔)绘制器。然后画。记住在绘制后销毁QPainer对象。例如:

Qt开发技术:Qt绘图系统(二)QPainter详解_合成模式

QPainter的核心功能是绘图,但是类还提供了几个功能,允许您自定义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函数绘制,如下图:

Qt开发技术:Qt绘图系统(二)QPainter详解_2D绘图_02

文字:drawText

Qt开发技术:Qt绘图系统(二)QPainter详解_绘图示例_03

void Widget::drawText(QPainter *painter)

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

点:drawPoint,drawPoints

Qt开发技术:Qt绘图系统(二)QPainter详解_Qt绘图系统_04

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

Qt开发技术:Qt绘图系统(二)QPainter详解_绘图示例_05

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

Qt开发技术:Qt绘图系统(二)QPainter详解_绘图示例_06

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

Qt开发技术:Qt绘图系统(二)QPainter详解_Qt绘图系统_07

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

Qt开发技术:Qt绘图系统(二)QPainter详解_Qt绘图系统_08

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);
Qt 绘图问题,急急急!

Qt基础之二十六:Qt绘图系统(Paint System)

✎Qt-doc—QPainter绘图系统&坐标系统

✎Qt-doc—QPainter绘图系统&坐标系统

✎Qt-doc—QPainter绘图系统&坐标系统

✎Qt-doc—QPainter绘图系统&坐标系统