当前位置: 首页 > news >正文

Qt 绘图

一、基础概念

‌Qt 绘图基于 QPainter(画家类)、QPaintDevice(绘图设备)和 QPaintEngine(绘图引擎)的协作实现。其中:

  • QPainter 提供绘制图形、文本和图像的接口(如 drawLine()drawRect())‌。
  • QPaintDevice 是绘图载体(如 QWidgetQPixmapQImage)‌。
  • QPaintEngine 处理底层渲染适配,开发者通常无需直接操作‌。
二、基本图形绘制
  1. 绘制流程

    示例代码‌:

    void MyWidget::paintEvent(QPaintEvent *event) {  
        QPainter painter(this);  
        painter.setPen(Qt::red);  
        painter.drawLine(0, 0, 100, 100);  
        painter.setBrush(Qt::blue);  
        painter.drawRect(50, 50, 200, 150);  
    }
    • 重写 paintEvent 方法‌:所有绘图操作需在 QWidget::paintEvent() 事件中执行,避免因控件未初始化导致渲染失败‌。
    • 创建 QPainter 对象‌:与绘图设备关联(如 QPainter painter(this) 表示在窗口上绘制)‌。
    • 设置绘图属性‌:
      • ‌画笔(QPen)‌:控制线条颜色、宽度、样式(如虚线)‌。
      • ‌画刷(QBrush)‌:定义填充模式(纯色、渐变或纹理)‌。
  2. 常见图形元素

‌1)几何图形‌:直线、矩形、圆形、多边形‌。

#include <QWidget>
#include <QPainter>

class MyWidget : public QWidget {
public:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿
        
        // 绘制直线
        painter.setPen(QPen(Qt::blue, 2));
        painter.drawLine(20, 20, 250, 20);
        
        // 绘制矩形(填充)
        painter.setBrush(Qt::yellow);
        painter.drawRect(50, 50, 150, 100);
        
        // 绘制圆形
        painter.setPen(QPen(Qt::red, 3));
        painter.setBrush(Qt::green);
        painter.drawEllipse(QPoint(200, 200), 50, 50);
        
        // 绘制多边形
        QPolygon polygon;
        polygon << QPoint(250, 50) << QPoint(300, 150)
                << QPoint(200, 100) << QPoint(100, 120);
        painter.setPen(QPen(Qt::black, 2));
        painter.setBrush(Qt::cyan);
        painter.drawPolygon(polygon);
    }
};

2‌)文本与字体‌:通过 drawText() 绘制,可设置字体大小、样式‌。
‌3)图像处理‌:使用 drawPixmap() 或 drawImage() 渲染图片,支持缩放、旋转等变换‌。

三、高级功能
  1. OpenGL 集成
    • 通过 QOpenGLWidget 实现 3D 图形渲染,利用 GPU 加速复杂场景绘制‌。
    • 核心流程:顶点数据准备 → 着色器编程 → 渲染管线配置‌。
      // 自定义 OpenGL 窗口类(继承 QOpenGLWidget 和 QOpenGLFunctions)
      class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions {
      public:
          GLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
          
      protected:
          // 初始化 OpenGL 环境(加载着色器、绑定缓冲区等)
          void initializeGL() override {
              initializeOpenGLFunctions();  // 初始化 OpenGL 函数接口‌:ml-citation{ref="6,7" data="citationList"}
              glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // 设置背景色
              
              // 编译着色器程序(顶点+片段)
              m_program = new QOpenGLShaderProgram(this);
              m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
              m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
              m_program->link();  // 链接着色器‌:ml-citation{ref="3,4" data="citationList"}
              
              // 绑定顶点数据
              float vertices[] = { /* 顶点坐标和颜色数据 */ };
              m_vao.create();
              m_vbo.create();
              m_vao.bind();
              m_vbo.bind();
              m_vbo.allocate(vertices, sizeof(vertices));  // 传递数据到 GPU‌:ml-citation{ref="1,7" data="citationList"}
              // 设置顶点属性指针(位置、颜色等)
              m_program->enableAttributeArray(0);
              m_program->setAttributeBuffer(0, GL_FLOAT, 0, 3, 6*sizeof(float));
              // ... 其他属性类似
              m_vao.release();
          }
      
          // 窗口尺寸变化时调整视口
          void resizeGL(int w, int h) override {
              glViewport(0, 0, w, h);  // 更新视口‌:ml-citation{ref="4,7" data="citationList"}
          }
      
          // 执行渲染(每帧调用)
          void paintGL() override {
              glClear(GL_COLOR_BUFFER_BIT);  // 清空颜色缓冲
              m_program->bind();
              m_vao.bind();
              glDrawArrays(GL_TRIANGLES, 0, 3);  // 绘制三角形‌:ml-citation{ref="2,7" data="citationList"}
              m_vao.release();
              m_program->release();
          }
      
      private:
          QOpenGLShaderProgram *m_program;
          QOpenGLVertexArrayObject m_vao;
          QOpenGLBuffer m_vbo;
      };
  2. QCharts 组件
    • 提供预置图表类型(折线图、柱状图、饼图等),简化数据可视化开发‌。
    • 基于 QChartView 和 QChart 构建,支持动态数据更新与交互‌。
  3. QCustomPlot(第三方)

该库支持各种类型的图表,如曲线图、散点图、柱状图、饼图、K线图等,而且用户还可以很容易地进行自定义设置和修改。提供更灵活的绘图功能,适合高频数据渲染‌。

   4.OSG 3D可视化(第三方)

OSG与Qt的集成为开发3D可视化应用提供了一个强大的平台。

相关文章:

  • 在线 SQL 转 Python ORM工具
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_10空状态的固定表头表格
  • 【Git学习笔记】Git结构原理及其分支管理模型分析
  • 抽象工厂模式
  • python报错: AttributeError: module ‘clr‘ has no attribute ‘AddReference‘
  • Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。
  • 六十天前端强化训练之第十九天全面掌握组件通信:父子组件 Props 传值终极指南
  • 设计模式-工厂模式、策略模式、代理模式、责任链模式
  • 蓝桥杯备赛-二分-跳石头
  • 《P1540 [NOIP 2010 提高组] 机器翻译 题解》
  • 中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南
  • 开源数据仓库全解 — 从原理到实践
  • 【Excel】- 导入报错Can not find ‘Converter‘ support class LocalDateTime
  • 变频器与电机共地可能引发的电磁耦合会引起的故障
  • 【蓝桥杯】24省赛:数字串个数
  • 如何在实际应用中测量和调整直线导轨的预紧力?
  • c++stl之unordered-map以及set
  • CentOS系统中使用sendmail
  • Python爬虫:playwright的使用
  • 【数据结构】数据结构,算法 概念
  • 5月起,这些新规将施行
  • 两部门调度部署“五一”假期安全防范工作,要求抓好旅游安全
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电
  • 一位排球青训教练的20年时光:努力提高女排球员成才率
  • 遭遇大规模停电,西班牙内政部宣布进入国家紧急状态
  • 党旗下的青春|83岁仍在“下生活”,他说生活是创作的源泉