1. Qt C++ 二维绘图类库全景解析
在Qt框架中,二维绘图功能主要通过Qt Painting System实现,这套系统为开发者提供了完整的2D图形绘制解决方案。作为一套成熟的图形绘制框架,它包含了从基础绘图工具到高级图形管理的完整类体系。
1.1 核心绘图类
1.1.1 QPainter - 绘图执行引擎
QPainter是Qt绘图系统的核心类,负责所有具体的绘图操作。它采用状态机设计模式,内部维护着当前绘图状态,包括画笔、画刷、字体等属性。实际开发中,我们通常在以下场景使用QPainter:
cpp复制void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this); // 在QWidget上创建绘图对象
painter.setPen(Qt::red); // 设置红色画笔
painter.drawLine(0, 0, width(), height()); // 绘制对角线
}
QPainter支持多种绘图操作:
- 基本图形:线条、矩形、椭圆、多边形等
- 复杂路径:贝塞尔曲线、弧形等
- 文本渲染:支持抗锯齿和复杂文字布局
- 图像绘制:支持图像缩放、旋转等变换
1.1.2 QPaintDevice - 绘图目标抽象
QPaintDevice是所有可绘制设备的基类,它定义了绘图表面的基本接口。在实际项目中,我们常用的具体实现类包括:
| 子类 | 适用场景 | 内存占用 | 渲染性能 |
|---|---|---|---|
| QWidget | 窗口部件绘制 | 低 | 中 |
| QImage | 图像处理/离屏渲染 | 高 | 高 |
| QPixmap | 界面元素缓存 | 中 | 高 |
| QPrinter | 打印输出 | - | 低 |
| QPicture | 绘图命令记录与回放 | 低 | 中 |
1.1.3 QPaintEngine - 底层绘图引擎
QPaintEngine是连接QPainter和具体绘图后端的桥梁。在开发中我们通常不直接使用它,但了解其工作原理有助于性能优化:
cpp复制// 获取当前设备的绘图引擎类型
if(painter.paintEngine()->type() == QPaintEngine::Raster) {
// 软件渲染路径优化
}
1.2 绘图工具类
1.2.1 QPen - 线条样式控制
QPen不仅控制线条的基本属性,还支持高级样式设置:
cpp复制QPen customPen;
customPen.setColor(QColor(255, 0, 0, 128)); // 半透明红色
customPen.setWidth(3); // 3像素宽
customPen.setStyle(Qt::DashDotLine); // 虚线点样式
customPen.setCapStyle(Qt::RoundCap); // 圆角线帽
customPen.setJoinStyle(Qt::MiterJoin); // 尖角连接
// 自定义虚线模式
QVector<qreal> pattern;
pattern << 5 << 3 << 2 << 3; // 5单位线,3单位空,2单位线,3单位空
customPen.setDashPattern(pattern);
1.2.2 QBrush - 填充样式控制
QBrush的填充功能远比表面看起来强大:
cpp复制// 渐变填充示例
QLinearGradient gradient(0, 0, 100, 100);
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::black);
gradient.setSpread(QGradient::ReflectSpread); // 反射式渐变
QBrush gradientBrush(gradient);
// 纹理填充示例
QPixmap texture(16, 16);
texture.fill(Qt::transparent);
QPainter texPainter(&texture);
texPainter.fillRect(0, 0, 8, 8, Qt::black);
texPainter.fillRect(8, 8, 8, 8, Qt::black);
QBrush textureBrush(texture);
1.2.3 QColor - 颜色表示
QColor支持多种颜色空间和高级特性:
cpp复制QColor c;
c.setRgb(255, 0, 0); // RGB
c.setHsv(0, 255, 255); // HSV
c.setCmyk(0, 255, 255, 0); // CMYK
c.setAlpha(128); // 半透明
// 颜色运算
QColor lig
