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

结果:

相关推荐
geovindu26 分钟前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
心易行者44 分钟前
Python自动化测试7步落地法:用python在线运行省掉90%环境配置时间
java·开发语言·人工智能·python·log4j·ai编程
tedcloud1231 小时前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
Tanjia_kiki2 小时前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
程序猿编码2 小时前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
传奇开心果编程2 小时前
【Rust入门知识点学与练】第5课:函数
开发语言·学习·rust
秋田君2 小时前
Qt_QMediaPlayer类与QMediaPlaylist类
开发语言·qt
mengzhi啊2 小时前
QT程序界面自适应1080/2K/4K屏幕。qputenv或者setAttribute
qt
统计学小王子2 小时前
数学建模国赛倒计时6天——《软件工具(R语言精讲)》
开发语言·数学建模·r语言
C++ 老炮儿的技术栈3 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化