Qt 2D绘图

Qt 2D绘图之四:绘图中的其他问题 *update()函数不会立即进行重绘,要等到Qt返回主事件循环后才会进行,所以多次调用update()函数一般只会引起一次paintEvent()函数调用。而调用repaint()函数会立即调用paintEvent()函数来重绘部件,只有在必须立即进行重绘操作的怡况下(比如在动画中),才使用repaint()函数。Qt也会通过合并多个重绘事件为一个事件来加快绘制,当update()函数被调用多次,或者窗口系统发送了多个重绘事件,那么Qt就会合并这些事件成为一个事件,而这个事件拥有最大的需要重绘的区域。 阅读详情

前面一节我们讲解了图片的显示, 其中很多都用到了坐标的变化,这一节我们简单讲一下Qt的坐标系统,其实也还是主要讲上一节的那几个函数。这里我们先讲解一下Qt的坐标系,然后讲解那几 个函数,它们分别是:

translate()函数,进 行平移变换;scale()函数,进行比例变换;rotate()函数,进行旋转变换;shear()函数,进行扭曲变换。

最后介绍两个有用的函数 save()和restore(),利用它们来保存和弹出坐标系的状态,从而实现快速利用几个变换来绘图。

一、坐标系简 介。

Qt中每一个窗口都有一个坐标系,默认的,窗口左 上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位增减。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::red);
painter.drawRect(0,0,100,100);
painter.setBrush(Qt::yellow);
painter.drawRect(-50,-50,100,100);
}

我们先在原点(0,0)绘制了一个长宽都是100 像素的红色矩形,又在(-50,-50)点绘制了一个同样大小的黄色矩形。可以看到,我们只能看到黄色矩形的一部分。效果如下图。


二、坐标系变换。

坐标系变换是利用变换矩阵来进行的, 我们可以利用QTransform类来设置变换矩阵,因为一般我们不需要进行更改,所以这里不在涉及。下面我们只是对坐标系的平移,缩放,旋转,扭曲等应 用进行介绍。

1.利用 translate()函数进行平移变换。

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::yellow);
painter.drawRect(0,0,50,50);

painter.translate(100,100); //将点(100,100)设为原点

painter.setBrush(Qt::red);
painter.drawRect(0,0,50,50);

painter.translate(-100,-100);

painter.drawLine(0,0,20,20);
}
效果如下。


这里将 (100,100)点作为了原点,所以此时(100,100)就是(0,0)点,以前的(0,0)点就是

(-100,-100) 点。要想使原来的(0,0)点重新成为原点,就是将(-100,-100)设为原点。

2.利 用scale()函数进行比例变换,实现缩放效果。

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::yellow);
painter.drawRect(0,0,100,100);

painter.scale(2,2); //放大两倍

painter.setBrush(Qt::red);
painter.drawRect(50,50,50,50);
}
效果如下。


可以看 到,painter.scale(2,2),是将横纵坐标都扩大了两倍,现在的(50,50)点就相当于以前的

(100,100) 点。

3. 利用shear()函数就行扭曲变换。

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::yellow);
painter.drawRect(0,0,50,50);

painter.shear(0,1); //纵向扭曲 变形
painter.setBrush(Qt::red);
painter.drawRect(50,0,50,50);
}
效果如下。


这里,painter.shear(0,1),是对纵向进行扭曲,0表示不扭曲,当将第一个0更改时就会对横行进行扭曲,关于扭曲变换 到底是什么效果,你观察一下是很容易发现的。

4.利用rotate()函数进行比例变换,实现缩放效果。

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(0,0,100,0);

painter.rotate(30); //以原点为中心,顺时针旋转30度
painter.drawLine(0,0,100,0);

painter.translate(100,100);
painter.rotate(30);
painter.drawLine(0,0,100,0);
}
效果如下。


因为默认的rotate()函数是以原点为中心进行顺时针旋转的,所以我们要想使其以其他点为中心进行旋转,就要先进行原点的变换。这 里的painter.translate(100,100)将(100,100)设置为新的原点,想让直线以其为中心进行旋转,可是你已经发现效果并非如 此。是什么原因呢?我们添加一条语句,如下:

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(0,0,100,0);

painter.rotate(30); //以原点为中心,顺时针旋转30度
painter.drawLine(0,0,100,0);

painter.rotate(-30);

painter.translate(100,100);
painter.rotate(30);
painter.drawLine(0,0,100,0);
}

效果如下。


这时就是我们想要的效果了。我们加的一句代码为painter.rotate(-30),这是因为前面已经将坐标旋转了30度,我们需 要将其再旋转回去,才能是以前正常的坐标系统。不光这个函数如此,这里介绍的这几个函数均如此,所以很容易出错。下面我们将利用两个函数来很好的解决这个 问题。

三、坐标系状态的保护。

我们可以先利用save()函数来保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore()函数将以前的坐标系状 态恢复,其实就是一个入栈和出栈的操作。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.save(); // 保存坐标系状态
painter.translate(100,100);
painter.drawLine(0,0,50,50);

painter.restore(); //恢复以前的坐标系状态
painter.drawLine(0,0,50,50);
}
效果

利用好这两个函数,可以实现快速的坐标系切换,绘制出不同的图形。


FROM:  http://blog.chinaunix.net/uid-25749806-id-315300.html





Qt 2D绘图之一:基本图形绘制和渐变填充 参考文章链接: Qt 2D绘图之一:基本图形绘制和渐变填充2D 绘图系统如下: 2D 绘图主要是 QPainter、QPaintDevice、QPaintEngine 三个类,主要类的作用(其关系见图示)在QPainter中提供了一些方便的函数来绘制常用的图形,而且还可以设置线条和边框的画笔以及进行填充的画刷。新建Qt Gui应用,项目名称为 myDrawing,基类选择QWidget,类名为Widget。建立完成后,在widget.h文件中声明重绘事件处理函数: 绘制基本图形 在widget.cpp文件 阅读详情

相关推荐

AD/Protel老手才知道的PCB过孔查看技巧:3分钟分清通孔、盲孔和埋孔

本文为PCB设计工程师提供了在Altium Designer/Protel中快速鉴别通孔、盲孔和埋孔的实用技巧。通过层叠管理器、高级筛选工具和实战五步法,帮助用户在3分钟内精准识别过孔类型,提升设计效率和电路性能。特别适合处理高密度HDI板卡中的复杂过孔布局。

weixin_29164497的博客 493

Qt2D绘图详解

Qt 提供了一套完整的2D绘图API,主要通过QPainter类来实现,它可以绘制各种图形元素,包括文本、线条、形状、图像等。Qt中提供了的强大2D绘图系统,可以使用相同的API在屏幕上和绘图·设备上进行绘制,主要基于QPainter、QPainterDevice和QPainterEngine这3个类。1.QPainter执行绘图操作,QPainter可以绘制一切简单的图形,从简单的一条直线到任何复杂的图形。QPainter类可以在一切继承QPainterDevice的子类上进行绘制操作。

程序猿老樊的博客 932

QGIS:安装Deepness插件+应用

简单的描述了deepness的安装应用历程,重点是记录博主本次遇到的坑

fengyi157的博客 2235

Qt绘图:求圆和椭圆上任意角度点的坐标

本文主要根据椭圆坐标公式和旋转矩阵公式实现对应的Qt绘图代码

龚建波 1万+

求圆上点的坐标

文章已更新,最新文章地址:http://www.fearlazy.com/index.php/post/121.html 求圆上点的坐标需要已知的条件:圆心、半径、角度 假设圆心:o (x0,y0) 半径:r 角度:angle (角度是相对于图中红点位置而言,逆时针为负数,顺时针为正) 计算公式: p2 (x1,y1), 其中angle = 30 ...

fearlazy 3万+

QT qcustomplot画圆以及圆的定位方法

从官网的帮助文档可以看出圆的位置是根据左上角与右下角的位置信息确定的,具体位置可以根据圆心坐标与半径大小求得(详见下列代码) //创建圆 QCPItemEllipse*qcpitemellipse=new QCPItemEllipse(ui->centralWidget); qcpitemellipse->setPen(Pen2);、 圆的位置是根据左上角与右下角的位置信息确定的 qcpi...

weixin_60630397的博客 4109

分享几个Qt界面绘图时使用到的坐标计算算法

////////////////////////////////////////////////////////////////////////// // 已知屏幕坐标系上两点,且这两点不在的x坐标不相等,则他们所形成的 y = ax + b 形式的直线方程中: // a = (y2 - y1) / (x2 - x1), b = (x2 * y1 - x1 * y2) / ( x2 - x1) // 注意:y1、y2的值为两点的y值的相反数,如果要计算第三点的坐标,所得到的第三点y值同样需要再取其相反数作为

chenxipu123的博客 1万+

Qt—坐标系统

Qt—坐标系统坐标系统抗锯齿渲染1 逻辑表示2 抗锯齿绘画 坐标系统 Qt的坐标系统是由QPainter类控制的,而 QPainter是在绘图设备上进行绘制的。 一个绘图设备的默认坐标系统中,原点(0,0)在其左上角,x坐标向右增长,y坐标向下增长。 在基于像素的设备上,默认的单位是一个像素,而在打印机上默认的单位是一个点(1/72英寸)。 QPainter的逻辑坐标与绘图设备的物理坐标之间的映射由QPainter的变换矩阵、视口和窗口处理。逻辑坐标和物理坐标默认是一致的。 QPainter也支持坐标变换

Half-up的博客 3102

QT中的2D绘图的总结

因为QT属于现学现用,由于要用到QT 2D绘图,所以临时学习了一下,当然只是浅尝辄止,并没有对其进行深入的研究,只是能作为一个工具去使用去完成一定的任务,现在记录下来以便以后用到时可以快速的捡起。 QT中的2d 绘图,我们不得不提到一个QPainter类,该类包含了所有的简单图形的绘制方法,比如绘制矩形,椭圆,图片等等,使用非常简单,查看API即可。 在我的理解上QPainter就好比

Frozen_Wang的博客 1694

Qt实战之简易2D绘图

实现简易2D绘图工具,画线,签字

weixin_62370184的博客 1471

Qt实现2D绘图

Qt 2D绘图

sinat_31608641的博客 1398

Qt2D绘图的类有哪些】

介绍Qt2D绘图的类有哪些。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 627

Qt 2D绘图功能简单总结

文章目录Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片。 Qt绘图系统中由QPainter来完成具体的绘制操作。该类提供了大量高度优化的函数来完成GUI编程所需要的大部分绘制工作。 2D 绘图有两个思路: 1、不适用Qt的视图框架。 在一个部件重绘事件paintEvent()中绘制,首先创建QPainter对象,再进行图形的绘制,最后程序结束自动销毁QPaint对象。 例

qq_21291397的博客 642

Qt2D绘图

2D绘图 Qt4中的2D绘图部分称为Arthur绘图系统.它由3个类支撑整个框架,QPainter,QPainterDevice和QPainterEngine.QPainter用来执行具体的绘图相关操作 如画点,画线,填充,变换,alpha通道等。QPainterDevice是QPainter用来绘图绘图设备,Qt中有几种预定义的绘图设备,如QWidget,QPixamp,QPrinter

feiyangyangfei的专栏 2811

Qt深入浅出(十二)2D绘图

2D绘图​ 之前我们使用 QPainter 在 QWidget 上绘图, 那么其实 QPainter 还能在任何 QPaintDevice上绘制, 继承至QPaintDevice 还有QPixMap、QImage、QPicture,那么它们的区别是.​ 1、使用 QPixMap 进行绘图,根据硬件显示进行优化.​ 2、使用 QImage 进行绘图,独立与硬件,保存最原始的图片数据.​ 3、QPic...

qq769651718的专栏 1660

2D简单绘图---QT

昨天我女朋友看了我的文章,和我说了一句:你这样写文章,不深入!哎呀,这句话把我说的那可这是有点杯具啊!不过,说得好,一句挫中了我写文章的缺点,最后我只想说一句:老婆大人威武(开玩笑啦)!好,吸取教训,以后的文章争取给大家说的详细一些,毕竟我现在还是一个大二的学生,能力有限,还望大家谅解,不过我会尽力把我知道的东西,尽量的抖出来!        好了,又说了定废话,进入主题吧。今天咱说说QT2D

天虹 4010

使用Qt进行2D绘图

文章目录基本绘制和填充基本图形的绘制和填充1. 绘制图形2. 使用画笔3. 使用画刷渐变填充1. 线性渐变2. 径向渐变3. 锥形渐变坐标系统抗锯齿渲染1. 逻辑表示2. 抗锯齿绘图坐标变换1. 基本变换2. 窗口-视口变换实例讲解分析坐标变换原因防止图形变形与定时器结合做一个动画其他绘制绘制文字绘制路径1. 组成一个路径2. 填充规则绘制图像1. QImage2. QPixmap屏幕截取功能3. QPicture复合模式绘图中的其他问题1. 重绘事件2. 裁剪区域3. 读取和写入图像4. 播放GIF动画5

hellocoding的博客 8781

pubg 吃鸡 压强宏文件 雷蛇鼠标

pubg 吃鸡 压强宏文件 雷蛇鼠标

上一篇: Qt 对话框的使用
下一篇: 【实例】Qt创建不规则窗体
imxiangzi
博客等级 码龄19年 1278粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值