【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.14 平移、旋转、缩放

本节对应的视频讲解: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
            }
        }
    }
}

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

image-20221222153008128

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大轮明王讲QT

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值