目录
事件处理机制概述
MFC与Qt事件处理对比
MFC事件处理
Qt事件处理
Qt事件传递机制
鼠标事件详解
鼠标事件类型
事件处理函数
编辑
鼠标相关信息与反馈
键盘事件详解
键盘事件类型
事件处理示例
编辑
键盘相关信息与反馈
常见按键代码和修饰键
键代码
修饰键
事件处理机制概述
MFC与Qt事件处理对比
特性 |
MFC |
Qt |
事件类型 |
窗口消息(如WM_XXX 系列) |
事件对象(如QMouseEvent ) |
处理方式 |
消息映射机制 |
事件处理函数 |
扩展性 |
较为固定 |
高度灵活,支持扩展 |
响应机制 |
基于消息循环 |
基于信号槽与事件机制 |
MFC事件处理
- 于消息映射机制
- 使用窗口消息(WM_*)
- 通过宏定义映射消息到处理函数
cpp
复制代码
BEGIN_MESSAGE_MAP(CMyWindow, CWnd)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
Qt事件处理
- 基于对象化的事件系统
- 使用事件类(QEvent子类)
- 通过重写虚函数处理事件
cpp
复制代码
class MyWidget : public QWidget {
protected:
void mouseMoveEvent(QMouseEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
};
Qt事件传递机制
cpp
复制代码
bool QWidget::event(QEvent* e) {
switch(e->type()) {
case QEvent::MouseButtonPress:
mousePressEvent(static_cast<QMouseEvent*>(e));
return true;
// ...其他事件处理
}
return QObject::event(e);
}
鼠标事件详解
鼠标事件类型
- 按键事件
- 移动事件
事件类型 |
描述 |
QMouseEvent::MouseButtonPress |
鼠标按键按下事件 |
QMouseEvent::MouseButtonRelease |
鼠标按键释放事件 |
QMouseEvent::MouseButtonDblClick |
鼠标按键双击事件 |
QMouseEvent::MouseMove |
鼠标移动事件 |
事件处理函数
mousePressEvent(QMouseEvent *event)
:处理鼠标按下事件。
mouseReleaseEvent(QMouseEvent *event)
:处理鼠标释放事件。
mouseDoubleClickEvent(QMouseEvent *event)
:处理鼠标双击事件。
mouseMoveEvent(QMouseEvent *event)
:处理鼠标移动事件。
cpp
复制代码
void mouseMoveEvent(QMouseEvent *event) override
{
if (event->buttons() & Qt::LeftButton) {
qDebug() << "鼠标移动 - 左键按下位置:" << event->pos();
} else if (event->buttons() & Qt::RightButton) {
qDebug() << "鼠标移动 - 右键按下位置:" << event->pos();
}
}
void mousePressEvent(QMouseEvent *event) override
{
qDebug() << "鼠标按下:" << event->pos();
}
void mouseReleaseEvent(QMouseEvent *event) override
{
qDebug() << "鼠标释放:" << event->pos();
}
void mouseDoubleClickEvent(QMouseEvent *event) override
{
qDebug() << "鼠标双击:" << event->pos();
}

鼠标相关信息与反馈
方法/属性 |
描述 |
QPoint pos() |
返回鼠标位置(相对窗口) |
QPoint globalPos() |
返回鼠标位置(全局屏幕) |
Qt::MouseButton button() |
返回触发事件的鼠标按键(如Qt::LeftButton ) |
Qt::MouseButtons buttons() |
返回事件发生时所有按下的按键 |
键盘事件详解
键盘事件类型
- KeyPress (按键按下)
- KeyRelease (按键释放)
事件类型 |
描述 |
QKeyEvent::KeyPress |
键盘按键按下事件 |
QKeyEvent::KeyRelease |
键盘按键释放事件 |
事件处理示例
keyPressEvent(QKeyEvent *event)
:处理键盘按下事件。
keyReleaseEvent(QKeyEvent *event)
:处理键盘释放事件。
cpp
复制代码
void keyPressEvent(QKeyEvent *event) override
{
if (event->modifiers() & Qt::ControlModifier) {
if (event->key() == Qt::Key_C) {
qDebug() << "检测到 Ctrl + C";
}
} else {
qDebug() << "按键:" << event->text();
}
}
void keyReleaseEvent(QKeyEvent *event) override
{
qDebug() << "键盘释放:" << event->text();
}

键盘相关信息与反馈
方法/属性 |
描述 |
int key() |
返回按键的键值(如Qt::Key_A ) |
QString text() |
返回按键对应的文本字符 |
bool isAutoRepeat() |
检查事件是否由于按键的自动重复触发 |
Qt::KeyboardModifiers modifiers() |
返回所有按下的修饰键(如Shift, Ctrl等) |
常见按键代码和修饰键
键代码
Qt 提供了丰富的键盘按键代码,通过 Qt::Key
枚举表示:
键 |
键值 |
A-Z |
Qt::Key_A 到 Qt::Key_Z |
0-9 |
Qt::Key_0 到 Qt::Key_9 |
功能键 |
Qt::Key_F1 到 Qt::Key_F12 |
方向键 |
Qt::Key_Left , Qt::Key_Right 等 |
其他键 |
Qt::Key_Space , Qt::Key_Return , Qt::Key_Delete 等 |
修饰键
修饰键用于标识辅助按键(如Shift、Ctrl、Alt等),常见修饰键如下:
修饰键 |
描述 |
Qt::ShiftModifier |
Shift 键 |
Qt::ControlModifier |
Ctrl 键 |
Qt::AltModifier |
Alt 键 |
Qt::MetaModifier |
Meta 键(Windows或Command键) |