是否有任何 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原始方法来执行此操作 #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。

对于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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top