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

结果:

相关推荐
whm27774 小时前
Visual Basic 值传递与地址传递
java·开发语言·数据结构
CHANG_THE_WORLD4 小时前
c语言位运算 汇编代码分析
c语言·开发语言·汇编
x_feng_x4 小时前
Java从入门到精通 - 集合框架(二)
java·开发语言·windows
Le1Yu4 小时前
雪崩问题及其解决方案(请求限流、线程隔离、服务熔断、fallback、sentinel实现以上功能)
java·开发语言
大飞记Python4 小时前
Chromedriver放项目里就行!Selenium 3 和 4 指定路径方法对比 + 兼容写法
开发语言·python
std78795 小时前
用C++ 实现屏幕保护程序
开发语言·c++
tumu_C5 小时前
无用知识研究:在trailing return type利用decltype,comma operator在对函数进行sfinae原创 [二]
开发语言·c++·算法
jjjxxxhhh1235 小时前
【项目-】Qt + QCustomPlot 实现频谱监测仪:四图联动、高频信号注入、鼠标交互全解析
开发语言·qt·交互
web安全工具库5 小时前
告别刀耕火种:用 Makefile 自动化 C 语言项目编译
linux·运维·c语言·开发语言·数据库·算法·自动化