Qt-键鼠事件

一、事件

这里主要是重写事件进行较复杂的开发,事实上槽函数已经可以解决91%的开发场景了。

1.1.🖱️ 鼠标事件

主要鼠标事件类型

事件类型 描述 常用方法
mousePressEvent 鼠标按下 button(), pos(), globalPos()
mouseReleaseEvent 鼠标释放 button(), pos()
mouseMoveEvent 鼠标移动 buttons(), pos()
mouseDoubleClickEvent 双击事件 button(), pos()
wheelEvent 滚轮事件 angleDelta(), pixelDelta()

1.2.⌨️ 键盘事件

主要键盘事件类型

事件类型 描述 常用方法
keyPressEvent 按键按下 key(), text(), modifiers()
keyReleaseEvent 按键释放 key(), text(), modifiers()

二、案例

2.1.鼠标事件

.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>


QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    void mousePressEvent(QMouseEvent *event) override
    {
        QString button;
        switch (event->button()) {
        case Qt::LeftButton: button = "左键"; break;
        case Qt::RightButton: button = "右键"; break;
        case Qt::MiddleButton: button = "中键"; break;
        default: button = "其他键"; break;
        }

        qDebug() << "鼠标按下:" << button
                 << "位置: (" << event->pos().x() << "," << event->pos().y() << ")"
                 << "全局位置: (" << event->globalPos().x() << "," << event->globalPos().y() << ")";

        // 记录按下位置,用于拖动等操作
        m_lastPos = event->pos();
    }

    void mouseReleaseEvent(QMouseEvent *event) override
    {
        qDebug() << "鼠标释放 at: (" << event->pos().x() << "," << event->pos().y() << ")";
    }

    void mouseMoveEvent(QMouseEvent *event) override
    {
        // 检查按下的按钮
        QString buttonsStr;
        if (event->buttons() & Qt::LeftButton) buttonsStr += "左键 ";
        if (event->buttons() & Qt::RightButton) buttonsStr += "右键 ";
        if (event->buttons() & Qt::MiddleButton) buttonsStr += "中键 ";

        if (!buttonsStr.isEmpty()) {
            qDebug() << "鼠标拖动 - 按下:" << buttonsStr
                     << "位置: (" << event->pos().x() << "," << event->pos().y() << ")";
        } else {
            // 只是移动,没有按下按钮
            // qDebug() << "鼠标移动: (" << event->pos().x() << "," << event->pos().y() << ")";
        }

        m_lastPos = event->pos();
        update(); // 触发重绘
    }

    void mouseDoubleClickEvent(QMouseEvent *event) override
    {
        qDebug() << "鼠标双击 at: (" << event->pos().x() << "," << event->pos().y() << ")";
    }

    void wheelEvent(QWheelEvent *event) override
    {
        QPoint angleDelta = event->angleDelta();
        if (!angleDelta.isNull()) {
            if (angleDelta.y() > 0) {
                qDebug() << "滚轮向上滚动";
            } else {
                qDebug() << "滚轮向下滚动";
            }
            qDebug() << "滚动角度:" << angleDelta;
        }

        QPoint pixelDelta = event->pixelDelta();
        if (!pixelDelta.isNull()) {
            qDebug() << "像素滚动:" << pixelDelta;
        }
    }
private:
    QPoint m_lastPos;


};
#endif // MAINWINDOW_H

.cpp

cpp 复制代码
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include<QDockWidget>
#include<QSaveFile>
#include <QFileInfo>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
     ui->setupUi(this);
    setMouseTracking(true); // 启用鼠标跟踪(即使不按下按钮也接收移动事件)
    setMinimumSize(400, 300);
}

MainWindow::~MainWindow()
{
    delete ui;
}

结果:

2.2.键盘事件

.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>


QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
protected:
    void keyPressEvent(QKeyEvent *event) override
    {
        QString keyText = event->text();
        int keyCode = event->key();

        // 检查修饰键(Ctrl, Alt, Shift等)
        QString modifiers;
        if (event->modifiers() & Qt::ControlModifier) modifiers += "Ctrl+";
        if (event->modifiers() & Qt::AltModifier) modifiers += "Alt+";
        if (event->modifiers() & Qt::ShiftModifier) modifiers += "Shift+";

        qDebug() << "按键按下:"
                 << "键码:" << keyCode
                 << "文本:'" << keyText << "'"
                 << "组合:" << modifiers;

        // 处理特定按键
        switch (keyCode) {
        case Qt::Key_Enter:
            qDebug() << "回车键按下";
            break;
        case Qt::Key_Space:
            qDebug() << "空格键按下";
            break;
        case Qt::Key_Up:
            qDebug() << "上箭头";
            break;
        case Qt::Key_Down:
            qDebug() << "下箭头";
            break;
        case Qt::Key_Left:
            qDebug() << "左箭头";
            break;
        case Qt::Key_Right:
            qDebug() << "右箭头";
            break;
        case Qt::Key_A:
            if (event->modifiers() & Qt::ControlModifier) {
                qDebug() << "Ctrl+A - 全选";
            }
            break;
        }

        // 标记事件已处理,阻止继续传播
        event->accept();
    }

    void keyReleaseEvent(QKeyEvent *event) override
    {
        qDebug() << "按键释放:" << event->key() << "文本:'" << event->text() << "'";
        event->accept();
    }

};
#endif // MAINWINDOW_H

.cpp

cpp 复制代码
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include<QDockWidget>
#include<QSaveFile>
#include <QFileInfo>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
     ui->setupUi(this);
    setFocusPolicy(Qt::StrongFocus); // 必须设置这个才能接收键盘事件
    setMinimumSize(400, 300);
}

MainWindow::~MainWindow()
{
    delete ui;
}

结果:

相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
慧都小项3 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
CoderYanger3 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读3 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
CCCCCCCCharlie3 天前
Linux进程控制四大核心操作
linux·开发语言