至此已经绘制出了所有的图形。
接下来讲解抗锯齿、平移旋转缩放这些功能
1. 抗锯齿
前面实现的效果中,仔细观看能看到明显的锯齿的效果,有无抗锯齿的对比如下:
![]() |
![]() |
首先,来到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();
}
}
}
以上的变换步骤,可以参考以下示意图:








