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

时间:2010-06-03 17:29:24

标签: c++ qt passwords capslock

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

我目前正在使用QLineEdit(是不是很好?)setEchoMode(QLineEdit::Password)

8 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

QT兴趣邮件列表上的

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