1. 循环绘制
在Qt中,坐标原点默认在左上角,因此以上将图形绘制在了PaintWidget的左上角
如何实现将图形铺满整个PaintWidget呢? 以绘制线段为例:
- 方法一:计算出每次绘制时两个点的坐标
- 方法二:平移-translate,移动绘图的坐标原点
![]() |
![]() |
可见:使用QPainter为提供的平移方法,在每次绘制时,就不需要改变两个端点的坐标
具体代码实现如下:
void PaintWidget::paintEvent(QPaintEvent *event)
{
// ...
// 3. 绘制所有图形
for (int x = 0; x < w; x += 100) {
for (int y = 0; y < h; y += 100) {
// 先保存原来的状态
painter.save();
painter.translate(x, y); // 将绘图坐标系的原点进行平移到(x, y)
switch (shape) {
case 0: // 点
painter.drawPoints(points, 4);
break;
// ...
case 13: // 图片
painter.drawPixmap(10, 10, QPixmap(":/images/qt-logo.png"));
break;
}
painter.restore();
}
}
// ...
}
说明:QPainter的保存和恢复
(1)save()和restore()用于保存和恢复QPainter的状态
(2)状态包括画笔的状态,画刷的状态,以及绘图的坐标原点等
(3)save()和restore()是一一对应的,要成对出现。变换操作完成后恢复到初始状态,避免影响后续的绘图








