qt

继承并重写类成员函数实现键盘事件

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <QApplication>
#include <QDebug>
#include <QPushButton>
#include <QWidget>
#include <QKeyEvent> // 必须包含键盘事件头文件

// 1. 创建一个自定义类继承 QWidget
class MyWindow : public QWidget {
public:
MyWindow() {
// 让窗口能够获取焦点,否则无法接收键盘事件
setFocusPolicy(Qt::StrongFocus);
}

protected:
// 2. 重写键盘按下事件
void keyPressEvent(QKeyEvent *event) override {
// 获取按下的键
if (event->key() == Qt::Key_Escape) {
qDebug() << "Esc pressed: Closing window...";
this->close();
} else if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) {
qDebug() << "Enter pressed!";
} else {
qDebug() << "Key pressed:" << event->text() << " (Code:" << event->key() << ")";
}
}

// 3. 重写键盘释放事件 (可选)
void keyReleaseEvent(QKeyEvent *event) override {
qDebug() << "Key Released:" << event->text();
}
};

int main(int argc, char *argv[]) {
QApplication a(argc, argv);

MyWindow *hw = new MyWindow();
hw->setWindowTitle("Keyboard Event Test");
hw->resize(300, 200);
hw->show();

QPushButton *button = new QPushButton("Focus Me", hw);
button->setGeometry(100, 80, 100, 30);

return a.exec();
}

类声明与实现分离使用键盘事件

1.mywindow.h (类声明)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QWidget>
#include <QPushButton>
#include <QKeyEvent>

class MyWindow : public QWidget {
Q_OBJECT // 启用 Qt 元对象系统

public:
explicit MyWindow(QWidget *parent = nullptr);
~MyWindow();

protected:
// 重写键盘事件处理器
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;

private:
QPushButton *m_button;
};

#endif // MYWINDOW_H

2. mywindow.cpp (类实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "mywindow.h"
#include <QDebug>

MyWindow::MyWindow(QWidget *parent) : QWidget(parent) {
// 1. 基本配置
this->setWindowTitle("Keyboard Event Test");
this->resize(300, 200);

// 2. 让窗口能够获取焦点,否则无法接收键盘事件
this->setFocusPolicy(Qt::StrongFocus);

// 3. 创建子控件
m_button = new QPushButton("Focus Me", this);
m_button->setGeometry(100, 80, 100, 30);
}

MyWindow::~MyWindow() {
}

// 处理按下按键
void MyWindow::keyPressEvent(QKeyEvent *event) {
if (event->key() == Qt::Key_Escape) {
qDebug() << "Esc pressed: Closing window...";
this->close();
} else if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) {
qDebug() << "Enter pressed!";
} else {
qDebug() << "Key pressed:" << event->text() << " (Code:" << event->key() << ")";
}
}

// 处理释放按键
void MyWindow::keyReleaseEvent(QKeyEvent *event) {
qDebug() << "Key Released:" << event->text();
}

3. main.cpp (入口)

1
2
3
4
5
6
7
8
9
10
11
12
#include <QApplication>
#include "mywindow.h"

int main(int argc, char *argv[]) {
QApplication a(argc, argv);

// 在栈上创建窗口是更常见的做法
MyWindow hw;
hw.show();

return a.exec();
}