打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Qt:鼠标事件和滚轮事件

几乎现在见到的桌面应用都用到了鼠标,少了鼠标的应用,操作起来会异常的麻烦。那么在Qt中怎么引入鼠标操作呢。在桌面上按下鼠标或者是移动鼠标的指针时,都会产生对应的鼠标事件。鼠标的组成除了鼠标之外还有滚轮,同时滚轮的滚动也有自己的事件。在Qt中QMouseEvent类用来产生鼠标事件。利用这个事件可以判断时哪个键按下了以及指针的当前位置。QWheelEvent类用来表示鼠标滚轮事件,主要控制的时滚轮的滚定方向和距离。
接下来主要是两种类的使用,新建Qt Widgets应用,项目名称为mynmoouseevent,基类选择QWidget保持类名不变,在设计模式始终拖入TextEdit。然后在widget.h文件中进行protected函数声明

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

然后在private中添加一个变量用来储存指针位置与窗口位置的差距。

QPoint offset;

最后添加头文件

#include <QMouseEvent>

形成的widget.cpp是这样的:

#include "widget.h"#include "ui_widget.h"#include <QMouseEvent>Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    QCursor cursor;                      // 创建光标对象    cursor.setShape(Qt::OpenHandCursor); // 设置光标形状    setCursor(cursor);                   // 使用光标}Widget::~Widget(){    delete ui;}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){      // 这里必须使用buttons()        QPoint temp;        temp = event->globalPos() - offset;        move(temp);// 使用鼠标指针当前的位置减去差值,就得到了窗口应该移动的位置    }}void Widget::mouseReleaseEvent(QMouseEvent *event) // 鼠标释放事件{    Q_UNUSED(event);    QApplication::restoreOverrideCursor();         // 恢复鼠标指针形状}void Widget::mouseDoubleClickEvent(QMouseEvent *event) // 鼠标双击事件{    if(event->button() == Qt::LeftButton){             // 如果是鼠标左键按下        if(windowState() != Qt::WindowFullScreen)      // 如果现在不是全屏            setWindowState(Qt::WindowFullScreen);      // 将窗口设置为全屏        else setWindowState(Qt::WindowNoState);        // 否则恢复以前的大小    }}void Widget::wheelEvent(QWheelEvent *event)    // 滚轮事件{    if(event->delta() > 0){                    // 当滚轮远离使用者时        ui->textEdit->zoomIn();                // 进行放大    }else{                                     // 当滚轮向使用者方向旋转时        ui->textEdit->zoomOut();               // 进行缩小    }}

在滚轮事件的处理函数中,使用QWheelEvent类的delta()函数获取了滚轮的移动距离,每当滚轮移动一下,默认15°,而delta函数的返回值事15X8即整数120。向上滚动鼠标返回正值,向下返回负值。而在这里需要说明一下,鼠标的移动事件默认是在鼠标按下才启动的,如果想不按下就获得就要在构造函数后添加一行代码:set Mouse Tracking(true)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Qt事件总结(鼠标、键盘)
QT:不规则窗口的实现
Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法
Qt 中 实现窗体拖动
06、Qt中的事件处理机制
QT鼠标事件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服