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可视化应用提供了一个强大的平台。

相关推荐
秦禹辰2 分钟前
宝塔面板安装MySQL数据库并通过内网穿透工具实现公网远程访问
开发语言·后端·golang
黄焖鸡能干四碗8 分钟前
智慧教育,智慧校园,智慧安防学校建设解决方案(PPT+WORD)
java·大数据·开发语言·数据库·人工智能
一只乔哇噻36 分钟前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
钮钴禄·爱因斯晨1 小时前
深入剖析LLM:从原理到应用与挑战
开发语言·人工智能
六点半8881 小时前
【C++】C++11 篇二
开发语言·c++
DDDDDDDRDDR1 小时前
C++容器:list
开发语言·c++·stl
Elnaij1 小时前
从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元
开发语言·c++
chen_ever1 小时前
golang之go modules
开发语言·后端·golang
郝学胜-神的一滴2 小时前
Effective Modern C++ 条款26:避免在通用引用上重载
开发语言·c++·程序人生
草莓熊Lotso2 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他