当密码字段处于活动状态时,是否有任何Qt内置方法警告用户(使用弹出窗口)CapsLock已打开?
我目前正在使用QLineEdit
(是不是很好?)setEchoMode(QLineEdit::Password)
。
答案 0 :(得分:3)
一旦用户按下某个键,您应该检查它是否为大写并且是否正在保持该班次。 如果未保持shift,并且输入为大写,则会打开大写锁定。 如果shift为down,输入为小写,也会打开大写锁定。
答案 1 :(得分:2)
A post from Veronique Lefrere有答案,如果您可以等待用户按键:
等待Qt :: Key_CapsLock类型 qkeyevent处理程序或事件过滤器 什么时候事件是QEvent :: KeyPress?
答案 2 :(得分:2)
由于似乎没有跨平台的QT原生方式来执行此操作,您可能希望使用#ifdef
编写几种与平台相关的方法来选择正确的平台。
在这种情况下,this QT forum article has the answer:
#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
。
答案 3 :(得分:1)
我已经解决了这个问题。我使用QToolTip QT - How to apply a QToolTip on a QLineEdit作为通知方式 用户关于大写锁定统计,当然还使用了一个获取当前状态的函数(GetKeyState(VK_CAPITAL))。缺点:这仅适用于Windows。
答案 4 :(得分:1)
对于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 );
}
答案 5 :(得分:0)
这真是对Biber答案的评论,但我没有足够的代表发布这些:P。这只是我读过的一个想法,我从来没有尝试过:S。
这是关于知道是否按下班次的方法,您是否看到了Qt::KeyboardModifiers中可以检测到的Qt::KeyEvent?有一个转换修饰符,它可能很有用。 顺便说一下,我还看到有一个名为Qt :: Key_CapsLock的键,也可以在关键事件中被检测到。
在Narek对您的问题的评论链接中阅读错误报告的链接,似乎该功能似乎不可用,所以我认为这样做的方法是做类似于Biber的事情建议。但是为了避免等待用户按下某个键,您可以触发/模拟在QLineEdit中放置字母的Keyboard事件。然后检查Biber说的话:如果字母是大写的,按下shift然后......等等。 最后删除QLineEdit的内容。希望它会发生得足够快以避免用户注意到它:P。
这是一个有点丑陋的工作,但它可能有效。如果有,请告诉我!
答案 6 :(得分:0)
如果您正在为KDE(而非通用Qt)撰写文章,请使用KModifierKeyInfo::isKeyLocked()。
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(警告:我没有测试过此代码示例)
答案 7 :(得分:0)
根据Ken Bloom的回答,我制作了一个Qt项目示例,演示了与此相关的关键UX模式。特别是重写QDialog :: event()每次捕获Caps Lock都很关键。
https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check