QT提供了强大的2D绘图功能,主要通过QPainter类和相关工具类实现。以下是QT绘图的主要知识点总结:
一、绘图系统基础
-
QPainter - 核心绘图类
- 提供大量绘图函数:点、线、矩形、椭圆、多边形、文本等
- 支持多种绘图设备:QPixmap、QImage、QWidget等
- 基本使用模式:
QPainter painter(this); painter.setPen(Qt::blue); painter.drawLine(0, 0, 100, 100);
-
绘图设备
- QWidget:在控件上绘图
- QPixmap:离屏像素图,适合屏幕显示
- QImage:独立于硬件的图像表示,支持像素级操作
- QPicture:记录和重放绘图命令
二、基本绘图操作
-
基本图形绘制
- 点:
drawPoint()
- 线:
drawLine()
- 矩形:
drawRect()
- 圆/椭圆:
drawEllipse()
- 多边形:
drawPolygon()
- 文本:
drawText()
- 图像:
drawImage()
,drawPixmap()
- 点:
-
路径绘图(QPainterPath)
- 创建复杂形状
- 组合基本图形
- 示例:
QPainterPath path; path.moveTo(20, 80); path.lineTo(20, 30); path.cubicTo(80, 0, 50, 50, 80, 80); painter.drawPath(path);
三、绘图属性设置
-
画笔(QPen)
- 控制线条样式、颜色、宽度等
- 示例:
QPen pen(Qt::green, 3, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin); painter.setPen(pen);
-
画刷(QBrush)
- 控制填充样式、颜色、渐变等
- 示例:
QBrush brush(Qt::blue, Qt::Dense4Pattern); painter.setBrush(brush);
-
字体(QFont)
- 控制文本显示样式
- 示例:
QFont font("Arial", 12, QFont::Bold); painter.setFont(font);
四、坐标系统与变换
-
坐标系统
- 逻辑坐标与物理坐标
- 视口(Viewport)和窗口(Window)概念
-
坐标变换
- 平移:
translate()
- 缩放:
scale()
- 旋转:
rotate()
- 剪切:
shear()
- 保存/恢复状态:
save()
,restore()
- 平移:
-
抗锯齿
setRenderHint(QPainter::Antialiasing)
五、高级绘图技术
-
渐变填充(QGradient)
- 线性渐变(QLinearGradient)
- 径向渐变(QRadialGradient)
- 锥形渐变(QConicalGradient)
- 示例:
QLinearGradient gradient(0, 0, 100, 100); gradient.setColorAt(0, Qt::white); gradient.setColorAt(1, Qt::black); painter.setBrush(gradient);
-
合成模式(QPainter::CompositionMode)
- 控制绘图时的像素混合方式
- 如
QPainter::CompositionMode_SourceOver
(默认)
-
绘制SVG(QSvgRenderer)
- 渲染矢量图形
六、绘图优化
-
双缓冲技术
- 先在QPixmap上绘图,再绘制到控件
- 避免闪烁
-
局部更新
- 使用
update(const QRect &)
只更新需要重绘的区域
- 使用
-
绘图事件
- 重写
paintEvent(QPaintEvent *)
实现自定义绘图
- 重写
七、实例代码
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// 设置抗锯齿
painter.setRenderHint(QPainter::Antialiasing);
// 绘制渐变背景
QLinearGradient bgGradient(0, 0, width(), height());
bgGradient.setColorAt(0, Qt::white);
bgGradient.setColorAt(1, Qt::lightGray);
painter.fillRect(rect(), bgGradient);
// 设置画笔和画刷
QPen pen(Qt::darkBlue, 2);
painter.setPen(pen);
QBrush brush(Qt::yellow);
painter.setBrush(brush);
// 绘制椭圆
painter.drawEllipse(50, 50, 100, 60);
// 绘制文本
QFont font("Arial", 16, QFont::Bold);
painter.setFont(font);
painter.drawText(50, 150, "QT绘图示例");
// 绘制路径
QPainterPath path;
path.moveTo(200, 50);
path.lineTo(250, 150);
path.lineTo(150, 150);
path.closeSubpath();
painter.drawPath(path);
}
八、常见应用场景
- 自定义控件开发
- 数据可视化(图表、曲线等)
- 图像处理应用
- 游戏开发
- CAD类软件
掌握QT绘图系统可以创建丰富多样的图形界面和可视化效果,是QT开发中的重要技能。