QPainter 默认只能在paintEvent中进行绘制
这在有些情况下会很不方便,有时候我们希望可以在任意地方直接进行绘制
为了实现这个目的,可以采用以下方法:
继承QWidget,通过子类提供直接绘制的方法,并将所有绘制保存到中间的QPixmap
最后在重载的paintEvent中将QPixmap复制显示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #pragma once #include <QtWidgets/QWidget> #include <QPainter> #include <QResizeEvent> class PaintWidget: public QWidget { Q_OBJECT public : PaintWidget(QWidget * parent = 0, Qt::WindowFlags f = 0) :QWidget(parent, f) { mPixmap = new QPixmap(width(), height()); mPainter = new QPainter(mPixmap); } ~PaintWidget() { delete mPainter; delete mPixmap; } void resizeEvent(QResizeEvent *event) { if (event->size().width() > mPixmap->width() || event->size().height() > mPixmap->height()) { QPixmap* pixmap = new QPixmap((std::max)(event->size().width(), mPixmap->width()), (std::max)(event->size().height(), mPixmap->height())); delete mPainter; mPainter = new QPainter(pixmap); mPainter->drawPixmap(0, 0, *mPixmap); delete mPixmap; mPixmap = pixmap; } } void paintEvent(QPaintEvent *event) { QPainter painter( this ); painter.drawPixmap(0, 0, *mPixmap); } QPainter* getPainter() { return mPainter; } private : QPixmap* mPixmap; QPainter* mPainter; }; |
使用说明:
通过子类提供的getPainter()方法获取QPainter指针以便进行绘制,比如:
paintWidget.getPainter()->drawLine(...);
paintWidget.update() ; //绘制之后记得通过paintWidget.update() 通知页面刷新
附:代码中的resizeEvent是为了保证缓存的QPixmap始终比widget大,根据情况你可以直接初始化为所希望的大小
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-03-11 RTMP vs RTMFP
2021-03-11 几种前沿的浏览器无插件技术
2015-03-11 POSIX 消息队列
2015-03-11 POSIX和SYSTEM的消息队列应该注意的问题
2015-03-11 消息队列接口API(posix 接口和 system v接口)
2015-03-11 Ubuntu 安装 Eclipse C/C++开发环境
2015-03-11 Ubuntu下Eclipse搭建ARM开发环境