Qt 之 Painter
文章目录
- 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相关推荐
- painter qt 好恶心_Qt之有关于Painter的理解
1.如果想要使用QPainter在某个控件上绘图,必须重写这个控件的PaintEvent事件.否则"QWidget::paintEngine: Should no longer be cal ...
- Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
打印图像是图像处理软件中的一个常用功能,打印图像实际上是在QPaintDevice中画图,与平常在QWidget.QPixmap和Qlmage中画图一样,都是创建一个QPainter对象进行画图的,只 ...
- qt 实现窗口局部镂空,并截图显示。
主要实现2 个功能点: 1 截图 2 窗口镂空 实现截图主要使用QGuiApplication::primaryScreen() 获取到QScreen ,然后调用QGuiApplication::gr ...
- Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转
Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...
- 9.如何使用QT绘制导航箭头的图标
利用QT绘制一个地图导航软件中的导航图标,代码如下 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLa ...
- Qt下使用Shader绘制三角形
在Qt下使用可编程管线编写OpenGL的流程是怎样的呢? 下面演示了Qt下使用可编程管线的基本代码:(绘制三个不同的三角形,并做些旋转变换) 在Qt中,我们从QGLWidget继承,来实现OpenGL ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- Qt中的基础图形绘制
文章目录 1 Qt中的基础图形绘制 2 Qt基础图形绘制中的视口和窗口 3 综合实例开发:简易绘图程序 3.1 需求分析 3.2 设计分析 1 Qt中的基础图形绘制 Qt图形系统中的关键角色: QPa ...
- Qt中的QDialog
文章目录 1 Qt中的QDialog 1.1 QDialog简介 1.2 模态对话框和非模态对话框 1.3 对话框的返回值 2 登陆对话框实例分析 2.1 分析 2.2 代码实现 2.3 登录对话框的 ...
最新文章
- 轻谈 return i++
- 「LibreOJ β Round #4」子集
- 如何学习 Go 语言的核心知识
- 如何在Java中检查对象是否为空?
- 好用的php空间,推荐国内三个优质的免费PHP空间
- 利用python将excel数据导入mySQL
- 收藏!数据建模最全知识体系解读
- 今天听阿里P8讲完SpringBoot,瞬间感觉自己白学了……
- 05引用类型以及特殊引用类型string
- 《Programming WPF》翻译 第9章 3.自定义功能
- PHP 判断变量是否定义、是否为空、是否为真
- 利用图神经网络进行社交机器人检测
- inovance变频器说明书参数设置_汇川md500说明书|汇川md500变频器使用说明书(汇川md500用户手册)下载 PDF 官方版 - 比克尔下载...
- 以阿尔兹海默症为例:深度解析AI+慢病商业模式
- 这一次,卡98%问题终于解决了
- 最详细的XAMPP的安装及使用教程(图文)
- Ubuntu学习NO7.Ubuntu指令训练集合
- 【CAN总线在汽车行业中的基础应用】
- 第三部分:成交动力学之成交激素(二)——2、独特
- Java 实现联机Ateroids飞船陨石小游戏(多线程,网络)