QT 学习一 paintEvent,QPainter ,QImage

paintEvent

paintEvent是QWidget的虚函数,用于处理绘图事件。触发时机包括窗口首次显示、大小改变、遮挡后恢复,或者调用update()和repaint()方法

接下来,用户可能想知道如何在paintEvent中使用QPainter。搜索结果提到QPainter通常在paintEvent中创建,并关联到绘图设备如QWidget。需要确保在paintEvent中进行绘制,否则可能出现问题。‌34

然后,注意事项部分。比如不能在非paintEvent的地方创建QPainter,资源管理如及时释放对象,性能优化方面建议预渲染到QPixmap。‌46 还有坐标系统,视口和窗口坐标的区别,这些也需要提到。‌4

结构方面,用户可能希望回答分点明确,比如基本概念、触发时机、使用步骤、注意事项。同时需要引用多个搜索结果,避免重复引用同一来源。比如引用‌12说明触发时机,‌34说明使用步骤,‌46注意事项。

还要注意不要用"根据搜索结果"这样的表述,而是用角标。比如在句末加上‌12。回答要结构化,可能用无序列表,每个部分下分点,确保每个点都有来源引用。

现在检查是否有遗漏的信息。比如绘图设备限制、资源管理中的RAII模式,以及示例代码。需要确保每个部分都有对应的引用来源,并且综合多个结果。例如,绘图设备限制来自‌12,资源管理来自‌45,示例代码结构参考‌57。

最后,确保时间正确,现在是2025年03月13日,但搜索结果的时间有2024和2023年的,但用户可能不需要处理时间相关的内容,只需正确引用即可。总结回答时避免使用复杂术语,保持清晰易懂。

paintEvent 函数详解

一、基本概念
  1. 功能定义
    paintEventQWidget 类中的虚函数,用于处理窗口或控件的绘图逻辑。所有需要在界面上动态绘制的图形、文本或图像操作都应在此函数中实现‌12。

  2. 触发时机

    • 窗口首次显示或需要重绘时(如被遮挡后恢复显示)‌12。
    • 窗口大小调整后自动触发重绘‌12。
    • 通过代码调用 update()repaint() 方法手动触发‌12。

二、使用步骤
  1. 创建 QPainter 对象

QPainter 使用指南

一、基本使用步骤
  1. 创建 QPainter 对象

    通常在 paintEvent 事件中创建,并关联到绘图设备(如 QWidget、QImage 等)‌14。

    示例代码框架:

    复制代码
    void TestRGB::paintEvent(QPaintEvent* e) {
        QPainter paint;
        paint.begin(this);
    
    
        paint.end();
    }
  2. 设置绘图属性

    • 画笔(Pen) ‌:控制线条颜色、宽度、样式(实线/虚线)等,例如 setPen(Qt::red) 或自定义画笔 ‌27。
    • 画刷(Brush) ‌:控制填充颜色和样式,例如 setBrush(Qt::blue) ‌27。
    • 字体(Font) ‌:用于文本绘制,例如 setFont(QFont("黑体", 30)) ‌6。
  3. 调用绘图函数

    支持绘制基本图形(线、矩形、椭圆等)、文本、图像等:

    • drawLine(0, 0, 100, 100):绘制直线 ‌26。
    • drawRect(QRect(10, 20, 280, 260)):绘制矩形 ‌67。
    • drawText(100, 100, "Hello Painter"):绘制文本 ‌6。
    • drawImage(QPoint(0, 0), image):绘制图像 ‌26。
  4. 结束绘图

    显式调用 end() 或在 QPainter 对象析构时自动结束绘图 ‌4。


二、高级功能
  1. 几何变换

    • 支持平移、旋转、缩放等变换,例如:

      复制代码

      cppCopy Code

      painter.translate(50, 50); // 平移坐标原点 painter.rotate(45); // 旋转 45 度 painter.scale(2.0, 1.5); // 缩放坐标系
      通过 save()restore() 管理绘图状态 ‌23。

  2. 抗锯齿与混合模式

    • 启用抗锯齿:setRenderHint(QPainter::Antialiasing) ‌3。
    • 设置像素混合模式:setCompositionMode(QPainter::CompositionMode_SourceOver) ‌3。
  3. 路径绘制(QPainterPath)

    支持复杂图形路径的绘制,例如:

    复制代码

    cppCopy Code

    QPainterPath path; path.moveTo(100, 100); path.lineTo(200, 200); path.quadTo(250, 100, 300, 200); painter.drawPath(path);

    适用于自定义形状和贝塞尔曲线 ‌37。


三、注意事项
  1. 绘图设备限制

    QPainter 必须在 paintEvent 事件或手动触发的绘制流程中使用,且需关联到有效的绘图设备(如 QWidget、QPixmap)‌14。

  2. 资源管理

    • 动态分配的 QPainter 需确保及时释放资源,避免内存泄漏 ‌58。

    • 推荐使用 RAII(资源获取即初始化)模式,例如:

      复制代码

      cppCopy Code

      QPainter painter(&pixmap); if (painter.isActive()) { // 绘图操作... }

  3. 性能优化

    • 避免在频繁调用的函数中重复创建 QPainter 对象。
    • 对于静态内容,可预渲染到 QPixmap 缓存中 ‌35。

四、示例汇总
复制代码
// 绘制带样式的直线
QPen pen(Qt::red);
pen.setWidth(5);
pen.setStyle(Qt::DashLine);
painter.setPen(pen);
painter.drawLine(QPoint(100, 100), QPoint(300, 300));  // ‌:ml-citation{ref="2,6" data="citationList"}

// 绘制渐变填充的椭圆
QRadialGradient gradient(150, 150, 100);
gradient.setColorAt(0, Qt::yellow);
gradient.setColorAt(1, Qt::transparent);
painter.setBrush(gradient);
painter.drawEllipse(50, 50, 200, 200);  // ‌:ml-citation{ref="3,7" data="citationList"}

参考资料

相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner14 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner15 天前
DicomViewer (目录调整) 2
qt
xcyxiner15 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00617 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术17 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript