Qt - 密码字段,关于大写锁定的警告
题
是否有任何 Qt 内置方法可以警告用户(通过弹出窗口)在密码字段处于活动状态时 CapsLock 已打开?
我目前正在使用 QLineEdit
(很好吗?) 与 setEchoMode(QLineEdit::Password)
.
解决方案 4
我已经解决了这个问题。我已经使用了qtooltip QT-如何在qlineedit上应用qtooltip 作为向用户告知CAPS锁定统计数据的一种方式,当然是使用当前状态(getKeyState(vk_capital))的函数。缺点:这仅在Windows上起作用。
其他提示
用户按下键后,您应该检查它是否是较高的情况以及是否持有轮班。如果不举行移位,并且输入为大写,则盖子锁定。另外,如果移位降低,并且输入是小写的,则盖子锁定也打开。
Veronique Lefrere的帖子 在QT兴趣邮件列表上,如果您可以等待用户按键:
等待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。
对于Mac,要检测Caps锁定键的状态,您可以执行以下操作。
创建一个.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::键盘修改器 可以检测到 Qt::按键事件?有一个移位修饰符,它可能很有用。顺便说一句,我还看到有一个名为 Qt::Key_CapsLock 的键,也可以在按键事件中检测到。
阅读 Narek 对您的问题的评论中的错误报告链接,似乎该功能不可用,所以我认为这样做的方法是执行类似于 Biber 建议的操作。但为了避免等待用户按下某个键,也许您可以触发/模拟一个键盘事件,将一个字母放入您的 QLineEdit 中。然后检查 Biber 所说的:如果字母是大写并且按下了 Shift 键,那么......ETC。最后删除QLineEdit的内容。希望它发生得足够快,以避免用户注意到它:P。
这是一个有点丑陋的解决办法,但它可能有效。如果有请告诉我!
根据Ken Bloom的答案,我做了一个QT项目示例,演示了与此相关的关键UX模式。尤其是每次抓住盖帽锁定的Qdialog :: Event()至关重要。
https://github.com/savolai/qt-widgets-password-dialog-with-caps-lock-check