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() 渲染图片,支持缩放、旋转等变换‌。

三、高级功能
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;
    };
QCharts 组件
  • 提供预置图表类型(折线图、柱状图、饼图等),简化数据可视化开发‌。
  • 基于 QChartViewQChart 构建,支持动态数据更新与交互‌。
QCustomPlot(第三方)

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

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

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

相关推荐
WangMing_X1 小时前
C#实现动态验证码生成器:安全防护与实际应用场景
开发语言·安全·c#·验证码·图片
m0_555762901 小时前
qt designer中的Spacer相关设置
服务器·开发语言·qt
jk_1011 小时前
MATLAB中enumeration函数用法
开发语言·matlab
十年一梦实验室3 小时前
C++ 中的 RTTI(Run-Time Type Information,运行时类型识别)
开发语言·c++
纽约恋情3 小时前
C++——STL 常用的排序算法
开发语言·c++·排序算法
放羊郎3 小时前
Ubuntu从源代码编译安装QT
linux·qt·ubuntu
千里码aicood3 小时前
【2025】基于python+django的驾校招生培训管理系统(源码、万字文档、图文修改、调试答疑)
开发语言·python·django
小李苦学C++3 小时前
C++模板特化与偏特化
开发语言·c++
小王努力学编程3 小时前
元音辅音字符串计数leetcode3305,3306
开发语言·c++·学习·算法·leetcode
佚明zj3 小时前
【C++】如何高效掌握UDP数据包解析
开发语言·c++·udp