原文链接: Qt之键盘事件监听-实时响应大小写Capslock按键
一、开篇
假期总是转眼即逝,想想今天就是中秋节最后一天了,明天又要开始挤地铁了,好像还有一篇文章需要完成,前一段时间做了一个小功能,当用户输入密码时,如果键盘开启了大写,则需要重点提示用户,否则有些用户可能会误以为自己密码输入错误。
今天博主就来分析下当时的实现过程。
本篇文章主要讲解怎么实现实时监听大小写的过程,其他内容不做详细说明。文章分析的主线路是按博主当时完成此项功能的一个思路,虽然最后的解决方案才是对的,但前边一些尝试性的解决方案,博主这里还是都写了下来。一方面可以避免大家再去做无用的尝试,另一方面也是对自己实现这一功能时的一个总结。
二、效果展示
按照惯例先上图,看看是不是同学们想想中的效果。

三、实现思路
以下分几个小结来分析博主当时实现大小写监听的一个思路,虽然前两种方式不能达到最后的需求,但是大家也可以看看,或许他更适合于你另一种需求下的场景呢!
在讲各种实现方案时,我们先来搞清楚怎么获取当前键盘是否开启了大写,方法比较简单,只修要通过LOBYTE(GetKeyState(VK_CAPITAL))
函数即可获取。
最终我们的键盘相应函数可能会像下面这样,当发现了键盘按下(抬起)事件时,我们就调用这个函数重新设置大写提示
void CPasswordEdit::UpdateCapslockTip()
{
if (LOBYTE(GetKeyState(VK_CAPITAL)) == false)
{
m_ActCaps->setIcon(QIcon(":/PasswordWidget/64.png"));
}
else
{
m_ActCaps->setIcon(QIcon());
}
}
知道了如何判断是否开启键盘大写后,下一步就是需要搞清楚这个函数的触发时机,下面是博主的各种尝试过程。
1、重写QLlinEdit
要监听键盘事件,博主第一时间想到的就是继承这个控件,重写该控件的键盘回调函数,当该回调函数被触发时,就是有键盘按键被按下。
virtual void keyPressEvent(QKeyEvent * event) override;
virtual void keyReleaseEvent(QKeyEvent * event) override;
以上两个函数就是我们需要重写的两个按钮回调函数,函数的实现比较简单,判断当前是否是大小写按钮事件,如果有就执行UpdateCapslockTip函数,更新当前给用户的提示。
void CPasswordEdit::keyPressEvent(QKeyEvent * event)
{
if (event->key() == Qt::Key_CapsLock)
{
UpdateCapslockTip();
}
QLineEdit::keyPressEvent(event);
}
void CPasswordEdit::keyReleaseEvent(QKeyEvent * event)
{
if (event->key() == Qt::Key_CapsL