至此已经绘制出了所有的图形。
接下来讲解抗锯齿、平移旋转缩放这些功能

1. 抗锯齿

前面实现的效果中,仔细观看能看到明显的锯齿的效果,有无抗锯齿的对比如下:

效果1 效果2

首先,来到paintwidget.cpp中,实现setAntialias()函数,如下:

void PaintWidget::setAntialias(bool antialias)
{
    this->antialias = antialias;
    update();
}

然后,来到paintEvent()中,设置抗锯齿选项,如下:

void PaintWidget::paintEvent(QPaintEvent *event) {
    // ...
    
    // 3. 绘制所有图形
    painter.setPen(pen);
    painter.setBrush(brush);
    painter.setRenderHint(QPainter::Antialiasing, antialias);
    
    for (int x = 0; x < w; x += 100) {
        for (int y = 0; y < h; y += 100) {
            // ...
        }
    }
}

2. 平移、旋转、缩放

本节讲解平移、旋转、缩放这些变换操作

首先,来到paintwidget.cpp中,实现setTransform()函数,如下:

void PaintWidget::setTransform(bool transform)
{
    this->transform = transform;
    update();
}

然后,来到paintEvent()中,添加变换操作,如下:

void PaintWidget::paintEvent(QPaintEvent *event) {
    // ...

    for (int x = 0; x < w; x += 100) {
        for (int y = 0; y < h; y += 100) {
            // 先保存原来的状态
            painter.save();
            painter.translate(x, y);  // 将绘图坐标系的原点进行平移到(x, y)

            if (transform) {
                // 按照如下写法,先缩放再平移,才能达到绕原图中心旋转缩放的效果
                painter.translate(50, 50);
                painter.rotate(90.0);
                painter.scale(0.7, 0.7);
                painter.translate(-50, -50);
                // painter.drawRect(rect);  // for test

                // 按照如下写法,不能达到绕原图中心旋转缩放的效果
                // painter.rotate(90.0);
                // painter.translate(0, -100);
                // painter.scale(0.6, 0.6);
            }

            switch (shape) {
                // ...
            }
            painter.restore();
        }
    }
}

以上的变换步骤,可以参考以下示意图:
image-20260813111339219