目录

2D Painting Example

Overview

Helper Class Definition

Helper Class Implementation

Widget Class Definition

Widget Class Implementation

GLWidget Class Definition

GLWidget Class Implementation

Window Class Definition

Window Class Implementation


2D Painting Example

QPainter类将2D的绘图给QpaintDevice的子类,这个子类包括QWidget和QImage。
QGLWidget是QWidget的子类,所以他可以重写paintEvent或Qpainter在设备上画图。但是这个painteEvent和QPainter和普通的QWidget是不同的,如果本机的OpenGL支持绘图,那么将会得到硬件的加速支持。
本例中,QWidget和QGLWidget的绘图,并且QWidget还抗锯齿,QGLWidget如果硬件支持,也能抗锯齿。

Overview

这里使用了QGLWidget和QWidget描绘的界面进行对比,并且,这个对比很直观,就放在旁边,这里使用Helper类去画相同的画面。

Helper Class Definition

在这个例子,为了描绘相同的动画效果,用了Helper类去画相同的功能。
Helper类:

  class Helper{public:Helper();public:void paint(QPainter *painter, QPaintEvent *event, int elapsed);private:QBrush background;QBrush circleBrush;QFont textFont;QPen circlePen;QPen textPen;};

除了构造函数,helper类还提供了painter函数去画东西。

Helper Class Implementation

构造函数的作用是初始化各个变量。

  Helper::Helper(){QLinearGradient gradient(QPointF(50, -20), QPointF(80, 20));gradient.setColorAt(0.0, Qt::white);gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39));background = QBrush(QColor(64, 32, 64));circleBrush = QBrush(gradient);circlePen = QPen(Qt::black);circlePen.setWidth(1);textPen = QPen(Qt::white);textFont.setPixelSize(50);}

绘制在paint()函数中使用QPainter类去在设备上画图。QPaintEvent提供了绘制区域的问题。

  void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed){painter->fillRect(event->rect(), background);painter->translate(100, 100);

在转换坐标前,首先填充下painter的区域,这样其余的画图都会从被转换坐标开始。
画一个螺旋,指定时间做指定的动作,让看的人感觉它是向外旋转。

      painter->save();painter->setBrush(circleBrush);painter->setPen(circlePen);painter->rotate(elapsed * 0.030);qreal r = elapsed / 1000.0;int n = 30;for (int i = 0; i < n; ++i) {painter->rotate(30);qreal factor = (i + r) / n;qreal radius = 0 + 120.0 * factor;qreal circleRadius = 1 + factor * 20;painter->drawEllipse(QRectF(radius, -circleRadius,circleRadius * 2, circleRadius * 2));}painter->restore();

在这个坐标系统中旋转了很多次,所以调用save()在让其复原,调用restore()。

      painter->setPen(textPen);painter->setFont(textFont);painter->drawText(QRect(-50, -50, 100, 100), Qt::AlignCenter, QStringLiteral("Qt"));}

Widget Class Definition

Widget使用helper类去绘画

  class Helper;class Widget : public QWidget{Q_OBJECTpublic:Widget(Helper *helper, QWidget *parent);public slots:void animate();protected:void paintEvent(QPaintEvent *event) override;private:Helper *helper;int elapsed;};

除了构造函数,还有paintEvent()函数,elapsed用于记录上次更新时间。

Widget Class Implementation

构造函数初始化各个成员。

  Widget::Widget(Helper *helper, QWidget *parent): QWidget(parent), helper(helper){elapsed = 0;setFixedSize(200, 200);}

animate()槽函数在任一时间被调用。

  void Widget::animate(){elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;update();}

在paintEvent()中调用Helper类实现重绘。

  void Widget::paintEvent(QPaintEvent *event){QPainter painter;painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);helper->paint(&painter, event, elapsed);painter.end();}

GLWidget Class Definition

GLWidget用于展示OpenGL绘图界面。

  class Helper;class GLWidget : public QOpenGLWidget{Q_OBJECTpublic:GLWidget(Helper *helper, QWidget *parent);public slots:void animate();protected:void paintEvent(QPaintEvent *event) override;private:Helper *helper;int elapsed;};

Helper类绘图,elapsed记录上一次更新的时间。

GLWidget Class Implementation

构造函数与Widget的构造函数是有差异的。

  GLWidget::GLWidget(Helper *helper, QWidget *parent): QOpenGLWidget(parent), helper(helper){elapsed = 0;setFixedSize(200, 200);setAutoFillBackground(false);}

QGL::SampleBuffers这个标识可以设置OpenGL抗锯齿,如果系统没有OpenGLDriver话是开启不成功的。可以设置OpenGL抗锯齿,如果系统没有OpenGLDriver话是开启不成功的。
animate()和widget一样。

  void GLWidget::animate(){elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;update();}

paintEvent()和widget一样。

  void GLWidget::paintEvent(QPaintEvent *event){QPainter painter;painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);helper->paint(&painter, event, elapsed);painter.end();}

Window Class Definition

window类:

  class Window : public QWidget{Q_OBJECTpublic:Window();private:Helper helper;};

包含一个Helper用于传给上面的两个界面。

Window Class Implementation

构造函数初始化,构造界面,以及布局:

  Window::Window(){setWindowTitle(tr("2D Painting on Native and OpenGL Widgets"));Widget *native = new Widget(&helper, this);GLWidget *openGL = new GLWidget(&helper, this);QLabel *nativeLabel = new QLabel(tr("Native"));nativeLabel->setAlignment(Qt::AlignHCenter);QLabel *openGLLabel = new QLabel(tr("OpenGL"));openGLLabel->setAlignment(Qt::AlignHCenter);QGridLayout *layout = new QGridLayout;layout->addWidget(native, 0, 0);layout->addWidget(openGL, 0, 1);layout->addWidget(nativeLabel, 1, 0);layout->addWidget(openGLLabel, 1, 1);setLayout(layout);QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, native, &Widget::animate);connect(timer, &QTimer::timeout, openGL, &GLWidget::animate);timer->start(50);}

每50毫秒重绘一下,大约每秒20帧。

Qt文档阅读笔记-官方2D Painting Example实例解析相关推荐

  1. Qt文档阅读笔记-官方Form Extractor Example实例解析

    目录 背景 解析官方例子 背景 最近迷上了WEB相关的代码,上个月初步分析了HTTP协议,能用telnet构造HTTP封包直接和WEB服务器通信,昨天晚上看到了Qt5.5.1版本里面有一个例子Form ...

  2. Qt文档阅读笔记-对Style Plugin Example实例的解析

    目录 前言 Style Plugin Example SimpleStylePlugin Class 定义 SimpleStylePlugin Class 实现 main()函数 The Simple ...

  3. Qt文档阅读笔记-QPointer的概念及实例(并发多线程实例)

    基本概念 QPointer提供了模板类,这个包含指针主要是针对于QObject. 当对象被销毁的时候会被自动设置为0,解决了指针悬挂问题.这里QPointer<T>中的T必须是QObjec ...

  4. Qt文档阅读笔记-Advanced Signals and Slots Usage解析与实例

    目录 官方解析 博主小栗子 对官方例子的实现 通过自定义信号与槽的方式,巧妙实现QSignalMap的功能 官方解析 某些时刻需要知道是哪个对象发的信号,可以用Qt提供了QObject::sender ...

  5. Qt文档阅读笔记-QLibrary基本概念及实例

    QLibrary类是在程序运行时加载动态动态链接库的. 可以通过使用构造函数添加需要加载的链接库路径,或者使用setFileName()函数设置路径.如果是绝对路径就直接加载,如果是相对路径QLibr ...

  6. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

  7. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图

    Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...

  8. Qt文档阅读笔记-Rotations Example相关

    Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...

  9. Qt文档阅读笔记-QML Canvas的官方解析及实例

    目录 官方解析 博主例子 官方解析 Canvas可以用于画直线或曲线,简单或复杂的形状,图形,图片,并且他能加文字,颜色,阴影,和颜色梯度,和其他的装饰,可以进行低像素操作.Canvas可以保存成图像 ...

最新文章

  1. 修改机器名、IP对arcgis server、portal的影响?
  2. UOJ#460. 新年的拯救计划 构造
  3. qt 中转化图片格式与大小的方法
  4. php扩展的xdebug,安装php扩展:Xdebug
  5. 【转载保存】推荐ApacheCN开源的一个机器学习路线图
  6. Vue中computed和watch的区别(面试题)
  7. tar (child): lbzip2: Cannot exec: No such file or directory 解决方法
  8. android activity 跳转与值
  9. Android10apk怎么传数据,Android不同apk之间传递参数与数据
  10. springmvc中关于post请求会出现乱码的整理
  11. IDEA+Java控制台实现商品管理系统
  12. “智慧银行”行业研究报告要点整理
  13. 计算机语言中block,plo(计算机编程语言)_百度百科
  14. 小白学习Java第七天
  15. UVA 11134 Fabled Rook 枚举 multiset加速
  16. 智能门铃app开发的功能有哪些
  17. Java后端学Android(13)-使用网络技术
  18. Unity3D-限制3D物体的旋转角度
  19. 12天背诵楞严咒的技巧_楞严咒快速背诵方法,我试了n种,最后选择了这些土方法...
  20. python学习之对excel文件的操作

热门文章

  1. InstallShield 2011正式发布
  2. 【硬核干货】如何高效找到优质编程项目?
  3. 修改weblogic(10.3)域的启动JDK
  4. 别再瞎搞数仓了!BAT内部大神:数据仓库不是谁都可以建的
  5. 【转载】我只是随便说说的即时通讯
  6. 我通过了阿里面试,但算法太差,还是没去!
  7. java system sleep_详解Java中的sleep()和wait()的区别
  8. 北大青鸟消防设备类型编码_探测器该如何编码?即报警区域、探测区域的真正用途...
  9. python turtle 椭圆_【python turtle如何画椭圆】
  10. 推荐北大饶毅教授的《生物学概念与途径》课程(慕课视频+讲义)