文章目录

  • QPainter
    • “用完后记得销毁”
      • Simple Code
      • 什么时候销毁
      • 使用智能指针
      • 采取哪种方式
    • update( ) 和 render( )区别
      • update() 方法
      • render()方法
    • save()和restore()函数
    • 在Widget中绘制
    • 画弧,画弦,画饼

QPainter

“用完后记得销毁”

Simple Code

void SimpleExampleWidget::paintEvent(QPaintEvent *){QPainter painter(this);painter.setPen(Qt::blue);painter.setFont(QFont("Arial", 30));painter.drawText(rect(), Qt::AlignCenter, "Qt");  //painter会在函数末尾结束时被销毁,因为painter是在堆栈上}
  • 注意

在使用后,记得要删除它。原文:“Remember to destroy the QPainter object after drawing”

什么时候销毁

当在堆栈中创建时(即,不是通过new创建),则不需要删除,就像上述Simple Demo一样。

假设动态分配了QPainter对象

 QPainter* painter = new QPainter(this);painter->setPen(Qt::blue);painter->setFont(QFont("Arial", 30));painter->drawText(rect(), Qt::AlignCenter, "Qt");// Delete object, since Qt wont do it for you:delete painter;   //手动删除

使用智能指针

boost::scoped_ptr painter = new QPainter(this);

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{boost::scoped_ptr<QPainter> painter = new QPainter(this);painter->setPen(Qt::blue);painter->setFont(QFont("Arial", 30));painter->drawText(rect(), Qt::AlignCenter, "Qt");
}

采取哪种方式

如果在本地创建QPainter,需要多久创建一次对象。如果导致开销,可以考虑将其做为成员变量,并重用它。

update( ) 和 render( )区别

重绘Widget的两种方法,在重写的QWidget::paintEvent()事件函数中,调用上述两种方法之一。

update() 方法

将重绘事件加入到列表,不一定马上就会重绘。在同一时刻多次调用update(), Qt会将它们合并成一个update()。 这样的好处是不会产生闪烁。

render()方法

立即重绘,不建议经常调用。

上述两个方法,可以通过指定参数来说明要绘制的区域

save()和restore()函数

了解这两个函数之前,先了解下painter的状态:

QPainter 的状态有画笔,画刷,字体,变换(旋转,移动,切变,缩放)等

在绘制之前,设置了painter的状态为State_A, 绘制某个内容,需要调整为State_B, 绘制完成后,painter的状态回到State_A。

QPainter painter(this);
... //设置painter的状态A
painter.save();
...// 设置painter的状态B, 如画笔,画刷,变换等
...// 绘制内容
painter.restore(); //回复painter到状态A

在Widget中绘制

在 QWidget 及其子类里绘图却没有这么自由,通常都是要在哪个 widget 上绘图,就需要在它的 paintEvent() 函数里绘图,即重写 paintEvent() 函数。如SimpleCode。

画弧,画弦,画饼

void QPainter::drawArc(const QRectF & rectangle, int startAngle, int spanAngle)
void QPainter::drawPie(const QRectF & rectangle, int startAngle, int spanAngle)
void QPainter::drawChord(const QRectF & rectangle, int startAngle, int spanAngle)
  • rectangle: 包围矩形
  • startAngle: 开始的角度,单位是十六分之一度,如果要从 45 度开始画,则 startAngle 为 45 * 16
  • spanAngle: 覆盖的角度,单位是十六分之一度
  • 绘制圆心为包围矩形的正中心,0 度在圆心的 X 轴正方向上
    角度的正方向为逆时针方向

Qt 之 Painter相关推荐

  1. painter qt 好恶心_Qt之有关于Painter的理解

    1.如果想要使用QPainter在某个控件上绘图,必须重写这个控件的PaintEvent事件.否则"QWidget::paintEngine: Should no longer be cal ...

  2. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)

    打印图像是图像处理软件中的一个常用功能,打印图像实际上是在QPaintDevice中画图,与平常在QWidget.QPixmap和Qlmage中画图一样,都是创建一个QPainter对象进行画图的,只 ...

  3. qt 实现窗口局部镂空,并截图显示。

    主要实现2 个功能点: 1 截图 2 窗口镂空 实现截图主要使用QGuiApplication::primaryScreen() 获取到QScreen ,然后调用QGuiApplication::gr ...

  4. Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转

    Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...

  5. 9.如何使用QT绘制导航箭头的图标

    利用QT绘制一个地图导航软件中的导航图标,代码如下 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLa ...

  6. Qt下使用Shader绘制三角形

    在Qt下使用可编程管线编写OpenGL的流程是怎样的呢? 下面演示了Qt下使用可编程管线的基本代码:(绘制三个不同的三角形,并做些旋转变换) 在Qt中,我们从QGLWidget继承,来实现OpenGL ...

  7. Qt 2D绘图之二:抗锯齿渲染和坐标系统

    一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...

  8. Qt中的基础图形绘制

    文章目录 1 Qt中的基础图形绘制 2 Qt基础图形绘制中的视口和窗口 3 综合实例开发:简易绘图程序 3.1 需求分析 3.2 设计分析 1 Qt中的基础图形绘制 Qt图形系统中的关键角色: QPa ...

  9. Qt中的QDialog

    文章目录 1 Qt中的QDialog 1.1 QDialog简介 1.2 模态对话框和非模态对话框 1.3 对话框的返回值 2 登陆对话框实例分析 2.1 分析 2.2 代码实现 2.3 登录对话框的 ...

最新文章

  1. 轻谈 return i++
  2. 「LibreOJ β Round #4」子集
  3. 如何学习 Go 语言的核心知识
  4. 如何在Java中检查对象是否为空?
  5. 好用的php空间,推荐国内三个优质的免费PHP空间
  6. 利用python将excel数据导入mySQL
  7. 收藏!数据建模最全知识体系解读
  8. 今天听阿里P8讲完SpringBoot,瞬间感觉自己白学了……
  9. 05引用类型以及特殊引用类型string
  10. 《Programming WPF》翻译 第9章 3.自定义功能
  11. PHP 判断变量是否定义、是否为空、是否为真
  12. 利用图神经网络进行社交机器人检测
  13. inovance变频器说明书参数设置_汇川md500说明书|汇川md500变频器使用说明书(汇川md500用户手册)下载 PDF 官方版 - 比克尔下载...
  14. 以阿尔兹海默症为例:深度解析AI+慢病商业模式
  15. 这一次,卡98%问题终于解决了
  16. 最详细的XAMPP的安装及使用教程(图文)
  17. Ubuntu学习NO7.Ubuntu指令训练集合
  18. 【CAN总线在汽车行业中的基础应用】
  19. 第三部分:成交动力学之成交激素(二)——2、独特
  20. Java 实现联机Ateroids飞船陨石小游戏(多线程,网络)

热门文章

  1. 数据库从入门到删库跑路(二) - - PL/SQL
  2. uniapp/微信获取用户定位
  3. 说脏话,在人类的发展过程中有什么意义?
  4. 黄金圈法则 Golden Circle
  5. 手机数据网络慢怎么修改服务器,手机4G网速慢怎么办 简单3招轻松提升网速
  6. Swift-27个知识点
  7. 【shotcut】旋转缩放 输出GIF
  8. the selection cannot be run on any server解决方法
  9. Springboot @EnableAutoConfiguration 详解
  10. python快速实现简易中国象棋游戏