Qt 事件系统之三:键盘事件

您所在的位置:网站首页 鼠标事件键盘事件 Qt 事件系统之三:键盘事件

Qt 事件系统之三:键盘事件

2023-08-20 01:13| 来源: 网络整理| 查看: 265

本文转载自https://www.cnblogs.com/linuxAndMcu/p/11023299.html 侵删

文章目录 一、简介二、常用操作三、按键与自动重复四、键盘捕获五、键盘按键单击、双击六、键盘按键长按

一、简介

QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件。

QKeyEvent 的 key() 函数可以获取具体的按键,对于 Qt 中给定的所有按键,可以在帮助中查看 Qt: :Key 关键字。需要特别说明的是,回车键在这里是 Qt::Key_Return;键盘上的一些修饰键,比如 Ctrl 和 Shift 等, 这里需要使用 QKeyEvent 的 modifiers() 函数来获取,可以在帮助中使用 Qt:: KeyboardModifier 关键字来査看所有的修饰键。

QKeyEvent 有两个键盘事件成员函数,在头文件.h中进行声明:

#include protected: void keyPressEvent(QKeyEvent *event); //键盘按下事件 void keyReleaseEvent(QKeyEvent *event); //键盘松开事件 二、常用操作

下面是些常用操作:

// 键盘按下事件 void Widget::keyPressEvent(QKeyEvent * event) { // 普通键 switch (event->key()) { // ESC键 case Qt::Key_Escape: qDebug() qDebug() // 如果按下了Shift键 if(event->key() == Qt::Key_M) qDebug()key() == Qt::Key_A) { qDebug() qDebug() } void MyButton::keyPressEvent(QKeyEvent *event) { qDebug() Q_OBJECT public: Widget(QWidget *parent = nullptr); protected: void keyPressEvent(QKeyEvent *event); private: MyButton* m_pBtn1; MyButton* m_pBtn2; }; #endif // WIDGET_H

Widget.cpp:

#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { this->resize(300,400); // 初始化按钮1 m_pBtn1=new MyButton(); m_pBtn1->setParent(this); m_pBtn1->setText("AAA"); m_pBtn1->move(10,10); m_pBtn1->resize(100,100); m_pBtn1->setObjectName("aaa"); // 初始化按钮2 m_pBtn2=new MyButton(); m_pBtn2->setParent(this); m_pBtn2->setText("BBB"); m_pBtn2->move(150,10); m_pBtn2->resize(100,100); m_pBtn2->setObjectName("bbb"); // 指定控件捕获键盘 m_pBtn1->grabKeyboard(); /*使按钮 AAA 捕获键盘,此时产生的键盘事件都只会发送给按钮 AAA,也就是说 其他部件无法获得键盘事件。 只有可见的部件才能捕获键盘输入,若 isVisible()返回 false,则该部件不能调用grabKeyboard()函数 */ } void Widget::keyPressEvent(QKeyEvent *event) { Q_UNUSED(event); qDebug() // 定时器 m_pTimer = new QTimer(this); connect(m_pTimer, &QTimer::timeout, [=]{ m_nClickCnt = 0; // 计数清零 m_pTimer->stop(); // 停止计时 qDebug() // 计数期间,如果QTimer已开始,则不重新开始 if(!m_pTimer->isActive()) m_pTimer->start(500); // 500ms是判断双击的时间间隔,不唯一,可根据实际情况改变 m_nClickCnt++; // 点击计数,在500ms内如果点击两次认为是双击 if(m_nClickCnt >= 2) { m_nClickCnt = 0; // 计数清零 m_pTimer->stop(); // 停止计时 qDebug() m_nClickCnt = 0; // 计数清零 m_pTimer->stop(); // 停止计时 qDebug() // Qt::Key_Control经实测,长按永远不会使isAutoRepeat()为true // 是否是长按可以从release中直接判断 if (!event->isAutoRepeat()) { // LongPress_初始值为false,如果非长按执行单击或双击动作判断 // 如果长按会在长按里将其置true,在最后的Relese(非长按)里就不会执行单击、双击判断的动作 if (!m_bLongPress) { if (!m_pTimer->isActive()) { m_pTimer->start(500); } m_nClickCnt++; if (m_nClickCnt == 2){ m_nClickCnt = 0; // 计数清零 m_pTimer->stop(); // 停止计时 qDebug() qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3