QT鼠标、键盘事件

一、鼠标

[鼠标点击 mousePressEvent](#鼠标点击 mousePressEvent)

[鼠标释放 mouseReleaseEvent](#鼠标释放 mouseReleaseEvent)

[鼠标移动 mouseMoveEvent](#鼠标移动 mouseMoveEvent)

[鼠标双击 mouseDoubleClickEvent](#鼠标双击 mouseDoubleClickEvent)

[鼠标滚轮 QWheelEvent](#鼠标滚轮 QWheelEvent)

二、键盘

[键盘按下 keyPressEvent](#键盘按下 keyPressEvent)

键盘松开keyReleaseEvent


一、鼠标

#include <QMouseEvent>

鼠标点击 mousePressEvent

复制代码
void Widget::mousePressEvent(QMouseEvent *event){  
    if(event->button() == Qt::RightButton){}

    if(event->button() == Qt::LeftButton){}
}

鼠标释放 mouseReleaseEvent

复制代码
void Widget::mouseReleaseEvent(QMouseEvent *event){ 
    if(event->button() == Qt::RightButton){}

    if(event->button() == Qt::LeftButton){}
}

鼠标移动 mouseMoveEvent

复制代码
void Widget::mouseMoveEvent(QMouseEvent *event){
    this->move(QPoint());
}

注:
event->globalPos();//光标的位置
QCursor::pos();//光标的位置
this->pos();//界面左上角位置

鼠标双击 mouseDoubleClickEvent

复制代码
void Widget::mouseDoubleClickEvent(QMouseEvent *event)

鼠标滚轮 QWheelEvent

复制代码
void Widget::wheelEvent(QWheelEvent* event)
{
//使用 angleDelta() 来获取滚动角度增量
    QPoint angleDelta = event->angleDelta();
    if (!angleDelta.isNull()) {
        int yDelta = angleDelta.y(); // 获取垂直方向上的增量

        if (yDelta > 0) {
            // 向上滚动
            qDebug() << "UP";
        }
        else if (yDelta < 0) {
            // 向下滚动
            qDebug() << "DOWN";
        }


//或者使用 pixelDelta() 来获取滚动像素增量
    QPoint pixelDelta = event->pixelDelta();
    if (!pixelDelta.isNull()) {
        int yDelta = pixelDelta.y(); // 获取垂直方向上的增量

        if (yDelta > 0) {}
        else if (yDelta < 0) {}
    }
}

注:qt5是event->delta();

二、键盘

#include <QKeyEvent>

键盘按下 keyPressEvent

复制代码
void Widget::keyPressEvent(QKeyEvent *event){
//特殊按键 如按下CTRL

  if(event->modifiers() == Qt::CTRL){}

//普通按键 如按下A

  if(event->key() == Qt::Key_A){}

  else{  
    QWidget::keyPressEvent(event);//保持基类默认
  }
}

键盘松开 keyReleaseEvent

复制代码
void Widget::keyReleaseEvent(QKeyEvent *event){
    switch (event->key()) {
    case Qt::Key_Up:
        if (!event->isAutoRepeat()) {} //使用isAutoRepeat是为了识别自动重复,即事件发生一次就执行一次功能
        break;
    case Qt::Key_Left:
        if (!event->isAutoRepeat()) {}
        break;
    default:
        break;
    }

    // 调用基类的方法来处理默认行为
    QWidget::keyReleaseEvent(event);
}

注:isAutoRepeat:

复制代码
如 
if (!event->isAutoRepeat()) {

    jump();

}

只会在按下一次键盘后执行一次jump函数,在游戏中就只会让角色跳跃一次。

相关推荐
_林枭_2 小时前
ZW3D二次开发_原生表单_如何设置表单左上角图标
qt·zw3d
会周易的程序员3 小时前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
UIU1143 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
闻缺陷则喜何志丹3 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
bnmoel4 小时前
C++ 基础入门篇(一):命名空间,输入&输出,缺省参数,函数重载
c++·函数重载·语法·命名空间·缺省参数
Zixhy4 小时前
多点巡检机器人项目技术总结
linux·c++·机器人·自动驾驶
Pointer Pursuit6 小时前
C++11特性(二)
前端·c++·算法
tudousisi2227 小时前
CSP 第3题训练 Day 5|CSP202509C HTTP 头信息|Blog A
c++
Quz7 小时前
QML 快捷键篇:基础快捷键与组合键序列
qt·qml
闻缺陷则喜何志丹8 小时前
【动态规划】P10726 [GESP202406 八级] 空间跳跃|普及+
c++·算法·动态规划·洛谷