本节对应的视频讲解:B_站_视_频
https://www.bilibili.com/video/BV1te4y1L7Mu
本节讲解平移、旋转、缩放这些变换操作
1. 关联信号槽
首先,在 widget.cpp
的构造中,为 “变换” 复选框,关联信号槽
// 平移、旋转、缩放
connect(ui->chkTransformation, SIGNAL(toggled(bool)), this, SLOT(transformChanged()));
2. 声明并实现槽函数
首先,在 widget.h
中声明 antialiasChanged() 槽函数:
class Widget : public QWidget
{
private slots:
void transformChanged();
};
然后,在 widget.cpp
中实现这个槽函数:
void Widget::transformChanged()
{
ui->paintWidget->setTransform(ui->chkTransformation->isChecked());
}
3. 实现 setTransform
首先,在 PaintWidget.h
中声明 setTransform函数,并定义一个成员变量 mAntialias,如下:
class PaintWidget : public QWidget
{
public slots:
void setTransform(bool transformed);
private:
bool mTransform;
};
然后,在 PaintWidget.cpp
中,实现 setTransform 函数:
void PaintWidget::setTransform(bool transformed)
{
this->mTransform = antialias;
update();
}
最后,由于上边调用了 update 之后,系统会自动调用 paintEvent
因此,在 paintEvent 中变换操作,来完成绘制
void PaintWidget::paintEvent(QPaintEvent *event)
{
for ( int x = 0; x < width(); x += 100 ) {
for ( int y = 0; y < height(); y += 100 ) {
// 先保存原来的状态
// (0,0),(0,100),(0,200),(0,300)...(0,600)
// (100,0),(100,100),(100,200),(100,300)...(100,600)
// ...
// (800,0),(800,100),(800,200),(800,300)...(800,600)
painter.save();
painter.translate(x, y); // translate 修改的是坐标系
if ( mTransform ) {
// 按照如下写法,先缩放再平移,才能达到绕原图中心旋转缩放的效果
painter.translate(50, 50);
painter.rotate(90.0);
painter.scale(0.7, 0.7);
painter.translate(-50, -50);
#if 0
// 按照如下写法,不能达到绕原图中心旋转缩放的效果
painter.rotate(90.0);
painter.translate(0, -100);
painter.scale(0.6, 0.6);
#endif
}
}
}
}
以上的变换步骤,可以参考以下示意图: