我的QT Creator学习笔记(十四)——事件系统之鼠标事件和滚轮事件

参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著

QMouseEvent类用来表示一个鼠标事件,在窗口部件中按下鼠标或者移动鼠标指针时都会产生鼠标事件。

QWheelEvent类用来表示鼠标滚轮事件,主要用来获取滚轮移动的放下和距离。

直接上栗子,实现功能:在界面上按着鼠标左键拖动窗口,双击鼠标左键全屏,按着鼠标右键使之称为一个自定义图标,使用滚轮放大缩小编辑器的内容。

新建Qt Widgets应用,项目名为mymouseevent,基类选择QWidget,类名保存Widget不变。在设计模式下,拖入一个TextEdit,然后在widget.h中添加函数声明如下。

protected:
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void wheelEvent(QWheelEvent *event);

再添加一个位置变量如下

private:
    QPoint offset;

在widget.cpp函数中添加头文件#include <QMouseEvent >,并在构造函数中,添加以下代码。

    QCursor cursor;//创建光标对象
    cursor.setShape(Qt::OpenHandCursor);//设置光标形状
    setCursor(cursor);//使用光标

然后实现头文件中声明的几个事件处理函数如下

void Widget::mousePressEvent(QMouseEvent *event)//鼠标按下事件
{
   if(event->button()==Qt::LeftButton)//如果是鼠标左键按下
   {
       QCursor cursor;
       cursor.setShape(Qt::ClosedHandCursor);
       QApplication::setOverrideCursor(cursor);//使鼠标指针暂时改变形状
       offset=event->globalPos()-pos();//获取指针位置和窗口位置的差值
   }else if(event->button()==Qt::RightButton)//如果是鼠标右键按下
   {
       QCursor cursor(QPixmap("../mymouseevent/logo.png"));
       QApplication::setOverrideCursor(cursor);//使用自定义的图标作为鼠标指针
   }
}

 鼠标按下事件,左键按改变指针形状,并记下当前指针位置与窗口位置的差值。右键按下,指针显示为自定义图标。

void Widget::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
{
    if(event->buttons()&Qt::LeftButton)
    {
        QPoint temp;
        temp=event->globalPos()-offset;
        move(temp);//使用鼠标当前的位置减去差值,就得到了窗口应该移动的位置
    }
}

鼠标移动处理事件。因为鼠标移动时会检测所有按下的键,所以这时候使用button()函数无法获得哪个按键被按下,只能使用Buttons函数与Qt::LeftButton安位与来判断左键是否按下

void Widget::mouseReleaseEvent(QMouseEvent *event)//鼠标释放事件
{
    Q_UNUSED(event);
    QApplication::restoreOverrideCursor();//恢复鼠标指针形状
}

 鼠标释放事件函数,使用restoreOverrideCursor()函数恢复鼠标指针形状。

void Widget::mouseDoubleClickEvent(QMouseEvent *event)//鼠标双击事件
{
    if(event->button()==Qt::LeftButton)//如果是鼠标左键按下
    {
        if(windowState()!=Qt::WindowFullScreen)//如果窗口不是全屏
           setWindowState(Qt::WindowFullScreen);//将窗口设置位全屏
        else
           setWindowState(Qt::WindowNoState);//恢复窗口以前大小
    }
}

鼠标双击事件处理函数,使用setWindowState()函数处理窗口状态。

void Widget::wheelEvent(QWheelEvent *event)//滚轮事件
{
    if(event->delta()>0)//当滚轮远离使用者时
        ui->textEdit->zoomIn();//放大
    else
        ui->textEdit->zoomOut();//缩小
}

滚轮事件处理函数。当滚轮向远离使用者旋转时,返回负值,当滚轮向靠近使用者旋转时返回正值。zoomIn和zoomOut函数实现放大缩小。

运行代码查看效果,如下图分别是程序启动后,单击鼠标左键,右击鼠标,移动窗口,放大缩小

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值