当前位置:网站首页>QT—绘制其他问题
QT—绘制其他问题
2022-07-04 20:49:00 【Half-up】
1. 重绘事件
前面讲到的所有绘制操作都是在重绘事件处理函数 paintEvent()中完成的,它是QWidget类中定义的函数。
一个重绘事件用来重绘一个部件的全部或者部分区域。
下面几个原因中的任意一个都会发生重绘事件:
- repaint()函数或者update()函数被调用;
- 被隐藏的部件现在被重新显示;
- 其他一些原因;
大部分部件可以简单地重绘它们的全部界面,但是一些绘制比较慢的部件需要进行优化而只绘制需要的区域(可以使用QPaintEvent::region()
来获取该区域),这种速度上的优化不会影响结果。
Qt也会通过合并多个重绘事件为一个事件来加快绘制,当update()
函数被调用多次,或者窗口系统发送了多个重绘事件
时,那么Qt就会合并这些事件成为一个事件,而这个事件拥有最大的需要重绘的区域。update()函数
不会立即进行重绘,要等到Qt返回主事件循环后才会进行,所以多次调用update()函数
一般只会引起一次paintEvent()函数
调用。
而调用repaint()函数
会立即调用paintEvent()函数
来重绘部件,只有在必须立即进行重绘操作的情况下(比如在动画中) ,才使用repaint()函数
。
update()
允许Qt优化速度和减少闪烁,但是repaint()函数
不支持这样的优化,所以建议―般情况下尽可能使用update()函数
。
还要说明一下,在程序开始运行时就会自动发送重绘事件而调用 paintEvent()函数。另外,不要在paintEvent()函数中调用update()或者repaint()函数
。
当重绘事件发生时,要更新的区域一般会被擦除,然后在部件的背景上进行绘制。
部件的背景一般可以使用setBackgroundRole()
来指定
然后使用setAutoFillBackground( true)
来启用指定的颜色。
例如,使界面显示比较深的颜色,则可以在部件的构造函数中添加如下代码:
setBackgroundRole(QPalette::Dark); //背景黑色
setAutoFillBackground(true); //启用设置的背景色
2. 剪切
QPainter
可以剪切任何的绘制操作,它可以剪切一个矩形、一个区域或者一个路径中的内容,这分别可以使用setClipRect( ) , setClipRegion()和 setClipPath()函数
来实现。
剪切会在QPainter的逻辑坐标系统
中进行。
下面的代码实现了剪切一个矩形中的文字:
QPainter painter(this);
painter.setClipRect(10,0,20,10); //剪贴
painter.drawText(10,10,tr("img")); //绘字,img
3. 读取和写入图像
要读取图像,最普通的方法是1. 使用QImage或者QPixmap的构造函数
,或者调用2. QImage::load()和QPixmap::load()
函数。
Qt中还有一个QImageReader类
,该类提供了一个格式无关的接口,可以从文件或者其他设备中读取图像。QImageReader类
可以在读取图像时提供更多的控制,例如,可以使用setScaledSize()函数
将图像以指定的大小进行读取,还可以使用setClipRect()
读取图像的一个区域。
由于依赖于图像格式底层的支持,QImageReader
的这些操作可以节省内存和加快图像的读取。
另外,Qt还提供了QImageWriter类
来存储图像
,它支持设置图像格式的特定选项,比如伽玛等级、压缩等级和品质等。当然,如果不需要设置这些选项,那么可以直接使用QImage::save()和 QPixmap::save()函数
。
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QImage image;
// 加载一张图片
image.load("../mydrawing3/image.png");
// 输出图片的一些信息
qDebug() << image.size() << image.format() << image.depth();
// 在界面上绘制图片
painter.drawImage(QPoint(10, 10), image);
// 获取镜像图片
QImage mirror = image.mirrored();
// 将图片进行扭曲
QTransform transform;
transform.shear(0.2, 0);
QImage image2 = mirror.transformed(transform);
painter.drawImage(QPoint(10, 160), image2);
// 将镜像图片保存到文件
image2.save("../mydrawing3/mirror.png");
}
保存
验证
4. 播放gif动画
QMovie类
是使用QImageReader
来播放动画的便捷类,使用它可以播放不带声音的简单的动画,比如gif文件格式。这个类提供了很方便的函数来进行动画的开始、暂停和停止等操作。
后面会讲
5. 渲染SVG文件
可缩放矢量图形(Scalable Vector Graphics,SVG)
是一个使用XML
来描述二维图形和图形应用程序的语言。
在Qt中可以使用QSvgWidget类
加载一个SVG文件,而使用QSvgRenderer类
在QSvgWidget
中进行SVG文件的渲染。
这两个类的使用很简单,这里就不再讲述,可以参考SVG Generator Example和SVG Viewer Example示例程序。
/
/
/
/
/
/
/
/如果还有其余再补充。
边栏推荐
猜你喜欢
At the right time, the Guangzhou station of the city chain science and Technology Strategy Summit was successfully held
输入的查询SQL语句,是如何执行的?
巅峰不止,继续奋斗!城链科技数字峰会于重庆隆重举行
改善机器视觉系统的方法
ArcGIS 10.2.2 | solution to the failure of ArcGIS license server to start
Exclusive interview of open source summer | new committer Xie Qijun of Apache iotdb community
Analysis of maker education technology in the Internet Era
[C language] deep understanding of symbols
应用实践 | 蜀海供应链基于 Apache Doris 的数据中台建设
Redis03 - network configuration and heartbeat mechanism of redis
随机推荐
WGCNA analysis basic tutorial summary
SolidWorks工程图添加材料明细表的操作
[leetcode] 17. Letter combination of telephone number
Master the use of auto analyze in data warehouse
Jerry's ad series MIDI function description [chapter]
Shutter WebView example
IIC (STM32)
Delphi soap WebService server-side multiple soapdatamodules implement the same interface method, interface inheritance
Redis bloom filter
杰理之AD 系列 MIDI 功能说明【篇】
奋斗正当时,城链科技战略峰会广州站圆满召开
面试官:说说XSS攻击是什么?
Roast B station charges, is it because it has no money?
[buuctf.reverse] 151_ [FlareOn6]DnsChess
超详细教程,一文入门Istio架构原理及实战应用
[public class preview]: basis and practice of video quality evaluation
每日一题-LeetCode556-下一个更大元素III-字符串-双指针-next_permutation
Kubeadm初始化报错:[ERROR CRI]: container runtime is not running
Huawei ENSP simulator configures DHCP for router
EhLib 数据库记录的下拉选择