一、事件
这里主要是重写事件进行较复杂的开发,事实上槽函数已经可以解决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;
}
结果:
