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

结果:

相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript