当前位置:网站首页>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示例程序。
/
/
/
/
/
/
/
/如果还有其余再补充。
边栏推荐
- Methods of improving machine vision system
- 巅峰不止,继续奋斗!城链科技数字峰会于重庆隆重举行
- 学习突围3 - 关于精力
- [buuctf.reverse] 151_ [FlareOn6]DnsChess
- The video sound of station B is very low - solution
- At the right time, the Guangzhou station of the city chain science and Technology Strategy Summit was successfully held
- 杰理之AD 系列 MIDI 功能说明【篇】
- Drop down selection of Ehlib database records
- Configuration of DNS server of Huawei ENSP simulator
- Jerry added the process of turning off the touch module before turning it off [chapter]
猜你喜欢
Maya lamp modeling
Arcgis 10.2.2 | arcgis license server无法启动的解决办法
LambdaQueryWrapper用法
Operation of adding material schedule in SolidWorks drawing
SolidWorks工程图添加材料明细表的操作
Huawei ENSP simulator enables devices of multiple routers to access each other
【微信小程序】协同工作与发布
Y56. Chapter III kubernetes from entry to proficiency -- business image version upgrade and rollback (29)
Huawei ENSP simulator configures ACL access control list
【公开课预告】:视频质量评价基础与实践
随机推荐
minidom 模塊寫入和解析 XML
Word文档中标题前面的黑点如何去掉
Master the use of auto analyze in data warehouse
[wechat applet] collaborative work and release
Difference between ApplicationContext and beanfactory (MS)
[weekly translation go] how to code in go series articles are online!!
Redis cache
Huawei ENSP simulator configures ACL access control list
redis布隆过滤器
巅峰不止,继续奋斗!城链科技数字峰会于重庆隆重举行
Jerry's ad series MIDI function description [chapter]
MP3是如何诞生的?
CAD中能显示打印不显示
案例分享|金融业数据运营运维一体化建设
OMS系统实战的三两事
杰理之AD 系列 MIDI 功能说明【篇】
MYSQL 用!=查询不出等于null的数据,解决办法
华为模拟器ensp的路由配置以及连通测试
【LeetCode】17、电话号码的字母组合
Flutter在 release版本,打开后随机白屏不显示内容