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;
}

结果:

相关推荐
滨HI011 小时前
C++ opencv拟合直线
开发语言·c++·opencv
沐浴露z11 小时前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm
艾莉丝努力练剑12 小时前
【C++:红黑树】深入理解红黑树的平衡之道:从原理、变色、旋转到完整实现代码
大数据·开发语言·c++·人工智能·红黑树
l1t12 小时前
利用DeepSeek优化SQLite求解数独SQL用于DuckDB
开发语言·数据库·sql·sqlite·duckdb
_OP_CHEN12 小时前
C++进阶:(七)红黑树深度解析与 C++ 实现
开发语言·数据结构·c++·stl·红黑树·红黑树的旋转·红黑树的平衡调整
硅农深芯12 小时前
如何使用ptqt5实现进度条的动态显示
开发语言·python·qt
Lhan.zzZ12 小时前
Qt数据可视化实战:饼图、线图与表格的完整指南
开发语言·qt·信息可视化
Acrelhuang12 小时前
筑牢用电防线:Acrel-1000 自动化系统赋能 35kV 园区高效供电-安科瑞黄安南
java·大数据·开发语言·人工智能·物联网
小龙报13 小时前
《算法通关指南数据结构和算法篇(4)--- 队列和queue》
c语言·开发语言·数据结构·c++·创业创新·学习方法·visual studio
民乐团扒谱机13 小时前
深入浅出理解克尔效应(Kerr Effect)及 MATLAB 仿真实现
开发语言·matlab·光学·非线性光学·克尔效应·kerr effect