1. 循环绘制

在Qt中,坐标原点默认在左上角,因此以上将图形绘制在了PaintWidget的左上角
如何实现将图形铺满整个PaintWidget呢? 以绘制线段为例:

  • 方法一:计算出每次绘制时两个点的坐标
  • 方法二:平移-translate,移动绘图的坐标原点
效果1 效果2

可见:使用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()是一一对应的,要成对出现。变换操作完成后恢复到初始状态,避免影响后续的绘图