一、基础概念
Qt 绘图基于 QPainter
(画家类)、QPaintDevice
(绘图设备)和 QPaintEngine
(绘图引擎)的协作实现。其中:
QPainter
提供绘制图形、文本和图像的接口(如drawLine()
、drawRect()
)。QPaintDevice
是绘图载体(如QWidget
、QPixmap
、QImage
)。QPaintEngine
处理底层渲染适配,开发者通常无需直接操作。
二、基本图形绘制
-
绘制流程
示例代码:
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):定义填充模式(纯色、渐变或纹理)。
- 重写
-
常见图形元素
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 组件
- 提供预置图表类型(折线图、柱状图、饼图等),简化数据可视化开发。
- 基于
QChartView
和QChart
构建,支持动态数据更新与交互。
QCustomPlot(第三方)
该库支持各种类型的图表,如曲线图、散点图、柱状图、饼图、K线图等,而且用户还可以很容易地进行自定义设置和修改。提供更灵活的绘图功能,适合高频数据渲染。
4.OSG 3D可视化(第三方)
OSG与Qt的集成为开发3D可视化应用提供了一个强大的平台。