14

是否有任何 Qt 内置方法来警告用户(带有弹出窗口)在密码字段处于活动状态时 CapsLock 已打开?

我目前正在使用QLineEdit(很好吗?)与setEchoMode(QLineEdit::Password).

4

8 回答 8

3

一旦用户按下一个键,您应该检查它是否为大写以及是否正在保持班次。如果 shift 未保持,并且输入为大写,则大写锁定打开。如果 shift 是向下的,并且输入是小写的,那么大写锁定也是打开的。

于 2010-06-03T17:54:56.330 回答
2

来自 QT Interest 邮件列表的 Veronique Lefrere 的帖子有答案,如果您可以等待用户按下某个键:

当事件是 QEvent::KeyPress 时,在 qkeyevent 处理程序或事件过滤器中等待 Qt::Key_CapsLock 类型吗?

于 2010-06-03T17:37:40.180 回答
2

由于似乎没有跨平台的 QT-native 方式来执行此操作,因此您可能希望使用#ifdefs 编写几种依赖于平台的方式来选择正确的平台。

在这种情况下,这篇 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 事件处理,那么你就不需要做#undefs.

于 2010-06-09T14:49:51.967 回答
1

我已经解决了这个问题。我使用了 QToolTip QT - How to apply a QToolTip on a QLineEdit作为通知用户大写锁定状态的一种方式,当然还使用了获取当前状态的函数(GetKeyState(VK_CAPITAL))。缺点:这仅适用于 Windows。

于 2010-06-11T12:11:05.920 回答
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 );
}
于 2014-10-16T09:05:06.837 回答
1

根据 Ken Bloom 的回答,我制作了一个 Qt 项目示例,展示了与此相关的关键 UX 模式。特别是重写 QDialog::event() 以每次捕获 Caps Lock 是至关重要的。

https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check

于 2017-05-20T08:52:16.347 回答
0

这确实是对 Biber 答案的评论,但我没有足够的代表来发布这些:P。这只是我读过的东西的想法,我从未尝试过:S。

这是关于知道是否按下 shift 的方法,您是否看到可以在Qt::KeyEvent中检测到的Qt::KeyboardModifiers?有一个移位修饰符,它可能很有用。顺便说一句,我还看到有一个名为 Qt::Key_CapsLock 的键也可以在键事件中检测到。

并阅读 Narek 对您的问题的评论中的链接中的错误报告链接,似乎该功能不可用,所以我认为这样做的方法是做一些类似于 Biber 建议的事情。但是为了避免等待用户按下一个键,也许你可以触发/模拟一个在 QLineEdit 中放置一个字母的键盘事件。然后检查 Biber 所说的内容:如果字母是大写并且按下了 shift 然后......等等。最后删除 QLineEdit 的内容。希望它发生得足够快,以避免用户注意到它:P。

这是一个有点丑陋的解决方法,但它可能有效。让我知道是否有!

于 2010-06-09T06:37:41.330 回答
0

如果您正在编写 KDE(而不是通用 Qt),请使用KModifierKeyInfo::isKeyLocked()

KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)

(警告:我没有测试过这个代码示例)

于 2010-06-10T04:12:07.853 回答