Qt - 密码字段,警告Caps-Lock

是否有任何Qt内置方法警告用户(使用弹出窗口)密码字段处于活动状态时CapsLock是否已打开? 我目前正在使用
QLineEdit
(是不是很好?)和
setEchoMode(QLineEdit::Password)
。     
已邀请:
一旦用户按下一个键,你应该检查它是否是大写字母以及是否保持了班次。 如果未保持shift,并且输入为大写,则会打开大写锁定。 如果shift为down,输入为小写,则也会打开大写锁定。     
如果您可以等待用户按键,Veronique Lefrere在QT Interest邮件列表上的帖子有答案:   等待一个Qt :: Key_CapsLock类型   qkeyevent处理程序或事件过滤器   当事件是QEvent :: KeyPress?     
由于似乎没有跨平台的QT本地方式来执行此操作,您可能希望使用
#ifdef
s编写几种与平台相关的方法来选择正确的平台。 在这种情况下,这篇QT论坛文章的答案如下:
#ifdef Q_OS_WIN32
# include <windows.h>
#else
#  include <X11/XKBlib.h>
# undef KeyPress
# undef KeyRelease
# undef FocusIn
# undef FocusOut
// #undef those Xlib #defines that conflict with QEvent::Type enum
#endif
bool QMyClass::checkCapsLock()
{
 // platform dependent method of determining if CAPS LOCK is on
#ifdef Q_OS_WIN32 // MS Windows version
 return GetKeyState(VK_CAPITAL) == 1;
#else // X11 version (Linux/Unix/Mac OS X/etc...)
 Display * d = XOpenDisplay((char*)0);
 bool caps_state = false;
 if (d)
 {
  unsigned n;
  XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
  caps_state = (n & 0x01) == 1;
 }
 return caps_state;
#endif
}
如果你把它放在它自己的源文件中,这样你就不会在那个文件中做任何其他的QT事件处理,那么你就不需要做
#undef
s了。     
我已经解决了这个问题。我使用过QToolTip QT - 如何在QLineEdit上应用QToolTip作为通知方式 用户关于大写锁定统计,当然还使用了一个获取当前状态的函数(GetKeyState(VK_CAPITAL))。缺点:这仅适用于Windows。     
对于mac,要检测大写锁定键的状态,您可以执行以下操作。 创建一个.h / .mm文件对,然后在Qt pro文件中包含这些文件,如下所示:
SOURCES += myFile.h

macx: OBJECTIVE_SOURCES += myFile.mm
在myFile.h中添加以下内容......
bool IsCapsEnabled_mac();
在myFile.mm中添加以下内容(包含/导入的顺序很重要)...
#include <QtCore>
#include <QtGui>
#include <QtMac>
#include "myFile.h"

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#include <CoreFoundation/CoreFoundation.h>
#include <ApplicationServices/ApplicationServices.h>

bool IsCapsEnabled_mac()
{
    NSUInteger flags = [NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;
    return ( flags & NSAlphaShiftKeyMask );
}
    
如果您正在为KDE编写(而不是通用Qt),请使用KModifierKeyInfo :: isKeyLocked()。
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(警告:我没有测试过此代码示例)     
这真是对Biber答案的评论,但我没有足够的代表来发布这些答案:P。这只是我读过的一个想法,我从未尝试过:S。 这是关于知道是否按下shift的方法,你看过可以在Qt :: KeyEvent中检测到的Qt :: KeyboardModifiers吗?有一个转换修饰符,它可能很有用。 顺便说一下,我还看到有一个名为Qt :: Key_CapsLock的密钥,也可以在密钥事件中检测到。 在Narek评论的评论链接中阅读错误报告的链接,似乎该功能似乎不可用,所以我认为这样做的方法是做一些类似于Biber建议的内容。但是为了避免等待用户按下某个键,您可以触发/模拟在QLineEdit中放置字母的Keyboard事件。然后检查Biber说的话:如果字母是大写的,按下shift然后......等等。 最后删除QLineEdit的内容。希望它会发生得足够快以避免用户注意到它:P。 这是一个有点丑陋的工作,但它可能会奏效。如果有,请告诉我!     
根据Ken Bloom的回答,我制作了一个Qt项目示例,演示了与此相关的关键UX模式。特别是重写QDialog :: event()每次捕获Caps Lock都很关键。 https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check     

要回复问题请先登录注册