一、运行环境
- QT 版本:QT 5.12.9
- 开发平台:windows
二、需求
在主窗口里有个QTextEdit 控件 ,用户可以在QTextEdit 上面编辑内容。现在要实现的功能是:编辑完内容之后,用户按Enter 键,将QTextEdit 上的内容发送出去。
三、需求分析
首先需要捕抓到这个键盘事件,然后再区分不同的按键,响应不同的处理。这里介绍通过QTextEdit 控件捕抓 按键的处理方法。在QTextEdit 的头文件中,定义了很多与按键相关的方法:
virtual bool event(QEvent *e) override;
virtual void timerEvent(QTimerEvent *e) override;
virtual void keyPressEvent(QKeyEvent *e) override;
virtual void keyReleaseEvent(QKeyEvent *e) override;
virtual void resizeEvent(QResizeEvent *e) override;
virtual void paintEvent(QPaintEvent *e) override;
virtual void mousePressEvent(QMouseEvent *e) override;
virtual void mouseMoveEvent(QMouseEvent *e) override;
virtual void mouseReleaseEvent(QMouseEvent *e) override;
virtual void mouseDoubleClickEvent(QMouseEvent *e) override;
virtual bool focusNextPrevChild(bool next) override;
这里,我们需要实现的是KeyReleaseEvent 方法,这样我们的就可以捕抓键盘事件。
四、实现步骤
- 重新定义一个继承QTextEdit 的新类UiSendEditText,在UiSendEditText 实现 KeyReleaseEvent 函数,这个函数实现事件捕抓。
- 新类UiSendEditText 定义一个新的接口方法,用来注册事件的处理函数。
- 在KeyReleaseEvent 函数里,调用2 中注册的事件处理函数,对特定事件进行处理。
- 在主窗口用新类UiSendEditText 代替 QTextEdit 。
五、实现代码
1. 头文件
#include <QObject>
#include <QWidget>
#include <QTextEdit>
#include <QMainWindow>
class UiSendEditText : public QTextEdit
{
public:
UiSendEditText();
void register_key_enter_handler(QMainWindow* pWindow);
protected:
void keyReleaseEvent(QKeyEvent *e) override;
QMainWindow * pWindow;
};
2. 源文件
#include <QDebug>
#include <QKeyEvent>
#include <QEvent>
#include "mainwindow.h"
UiSendEditText::UiSendEditText()
{
this ->pWindow = NULL;
}
void UiSendEditText::register_key_enter_handler(QMainWindow* pWindow)
{
this->pWindow = pWindow;
}
void UiSendEditText::keyReleaseEvent(QKeyEvent* e)
{
MainWindow* pMainWind = NULL;
if ( e->key() == Qt::Key_Return)
{
if (this->pWindow)
{
pMainWind = (MainWindow*)pWindow;
pMainWind ->sendPushButtonClick();
}
}
}
3. 主窗口 实例化对象并注册处理函数
textEdit = new UiSendEditText();
textEdit->register_key_enter_handler(this);
|