Qt实训项目----(4)

Qt实训项目----(4)

1.在主窗体工具栏中添加平移、旋转工具;
2.平移:以鼠标所在绘图区位置为中心,实现绘图区图片的平移,要求:
图片的平移方向和距离按鼠标滑动的方向和距离进行;
3.旋转:点击旋转工具,绘图区图片即进行顺时针90°旋转。

第一件事,还是看任务。任务1是在主窗体工具栏中添加平移、旋转工具;这个就很简单了,跟以前的添加动作是一样的,直接在ui界面里面新建添加就好了。
那看任务2,平移要求就不再多赘述了。按照要求,我们就要思考我们应该完成的过程操作是那些。骑士很简单跟绘图一样,只要我们获得两个点的坐标,我们就很容易的知道横纵坐标之间的差值(即平移的位置)。而且我们还要需要以我们鼠标为参考位置。其实我们也可以这样想,只要得到了平移的位置,管他鼠标位置在哪里,从哪里平移,我们只需要在我们绘图的函数p.drawPixmap()里面加上相应的横纵坐标之间的参数就好了。

void MainWindow::on_actionTranslation_triggered()
{
    setCursor(Qt::ClosedHandCursor);
    _drawState = 7;
}

这是槽函数事件,我们给一个信号为7,并且设置我们点击之后鼠标的显示图标变为一个小手图标,然后

//在鼠标点击事件中添加
else if (_drawState == 7)  //平移事件
        {
            m_Press = true;
            trans_start_Point = event->pos();
            qDebug()<<"trans_start_Point:"<<trans_start_Point;
        }

我们直接在鼠标点击事件中添加这个函数,而这一块代码是获得我们平移的初始位置,之后我们在鼠标移动事件中添加

if (event->buttons() && Qt::LeftButton && m_Press == true)
    {
        m_Press = true;
        trans_end_Point = event->pos();
        qDebug()<<"trans_end_Point:"<<trans_end_Point;
        diff_trans_x = trans_end_Point.x() - trans_start_Point.x();
        diff_trans_y = trans_end_Point.y() - trans_start_Point.y();
        update();
    }

这一块代码可以使得我们看起来发生移动事件就跟我们拖动一个项一样。而且它是时时更新的因为只要我们移动鼠标就会触发移动事件,而且每次触发都会有update()去执行。
其实我们完成到这里已经差不多算是完成任务了,但是为了代码的逻辑性,我们还需要一个释放事件mouseReleaseEvent(QMouseEvent *event)来直接获取我们得到的平移终点

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if (m_Press)
    {
        trans_end_Point = event->pos();
        qDebug()<<"trans_end_Point:"<<trans_end_Point;
        m_Press = false;
        _drawState = 0;
        setCursor(Qt::ArrowCursor);
        update();
    }
}

这一块代码代表我们这个事件已经完成了。因为我们直接在函数中直接初始化了_drawState和m_Press。
就这样任务2完成了。接着我们看任务3,任务3是要求我们点击旋转工具后,绘图区图片进行90°顺时针旋转。
到这里我们就应该能想到,如果对于旋转的函数来说,有rotate()还有QPixmap自带的一个函数transformed可以完成。(具体的操作需要看开发文档我就不过多的赘述了)
而在这里我用了一个QPixmap自带的函数transformed,我们也是和平移一样,直接在绘图的时候直接加上参数就好。

p.drawPixmap(0 + _dx + diff_trans_x,
                 rect.height() + _dy + diff_trans_y,
                 ui->centralWidget->width()*_factor,
                 ui->centralWidget->height()*_factor,
                 pix.transformed(matrix,Qt::SmoothTransformation));

这就是代码,而且我们可以看到不只是添加了transformed这个函数,而且还有其余的变量。
一般我们使用transformed这个函数的时候都要实例化一个QMatrix对象,这个对象就是我们需要旋转的图片,自己定义就好,而我们旋转的角度,也是在实例化的QMatrix对象上面操作的。那么我们就需要建立一个变量,存储旋转的角度即可。
说到这里可能大家都快糊涂了,觉得有点乱有看不懂,好吧直接上代码看看。(在这里我旋转的操作方式放在点击事件里,如果你们自己的需求,也可以直接放在槽函数里面)

void MainWindow::on_actionRotation_triggered()
{
    m_rotate_Press =true;
    _drawState = 8;
}

这就是槽函数,我已经说了我的操作流程是在点击事件中,那么看点击事件

//在鼠标点击事件中添加
else if (_drawState == 8 && m_rotate_Press == true)  //旋转事件
        {
              _drawState = 0;
            rotateAngle = 90;  //一定要注意初始化,不然每次程序进来都会update一次90°
            m_rotate_Press = false;
            update();
        }

然后我们直接看重绘事件,因为开始我们也说了,我们仅仅只是在重绘的函数里面添加的相关参数。(这里的rotateAngle 变量自己要定义和声明)

matrix.rotate(rotateAngle);
    p.drawPixmap(0 + _dx + diff_trans_x,
                 rect.height() + _dy + diff_trans_y,
                 ui->centralWidget->width()*_factor,
                 ui->centralWidget->height()*_factor,
                 pix.transformed(matrix,Qt::SmoothTransformation));
    //初始化旋转角度,不然每次执行都会旋转90°,因为在上面的rotateAngle作为全局变量已经是90°了
    rotateAngle = 0;

这里的matrix和rotateAngle 要自己去声明,作为一个全局变量,并不是和局部变量一样,用完自动销毁,而要我们自己去初始化,不然我们在点击完旋转工具后,每一次点击都会触发一次点击事件。而我们所需要的就是我们点击一次旋转一次即可。

好了这三个功能我们就完成了,其实也很简单,就是注意一下简简单单的逻辑即可。对于全局变量来说,如果我们只需要他做一次动作,那么一定要看看是否需要初始化,如果全局变量不初始化,会出现很多问题。

希望对初学Qt的人有所帮助,如果有错误,希望大家可以给我指出错误。?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值