2010-06-10 4 views
2

Я хочу создать диалоговое окно входа, наследуя QDialog. я ставлю в подклассе имени LoginDialog 2: объекты QLineEditQt - диалоговое окно входа

  1. для входа в систему
  2. пароль.

Я хочу быть в состоянии предупредить пользователя с сообщением, если блокировка колпачка включена, когда он начнет заполнять passwordLineEdit. Предположим, у меня есть функция, которая сообщает текущему состоянию кнопки CapsLock. Поэтому я хочу сделать eventFiltering в классе LoginDialog, чтобы понять, что пользователь начинает заполнять поле пароля (т. Е. Пользователь просто вступил в поле пароля)

Итак, для этой цели я написал следующее в конструкторе класса LoginDialog:

m_passwordLineEdit->installEventFilter(this); 

Таким образом, единственное, что нужно сделать - это реализовать функцию, которая может понять, что пользователь будет заполнять пароль. Кажется, это должно быть сделано с помощью следующей функции (??):

bool LoginDialog::eventFilter(QObject *target, QEvent *event) 
{ 
    if (target == m_passwordLineEdit) 
    { 


    } 
    return QDialog::eventFilter(target, event); 
} 

Мой вопрос: Как реализовать эту функцию ???

ответ

0
bool LoginDialog::eventFilter(QObject *target, QEvent *event) 
{ 
if (target == m_passwordLineEdit) 
{ 
    if (event->type() == QEvent::KeyPress) 
    { 
     if(checkCapsLock()) 
     { 
      QToolTip::showText(m_passwordLineEdit->mapToGlobal(QPoint()), "Warning: CapsLock is ON."); 
     } 
     else 
     { 
      QToolTip::showText(m_passwordLineEdit->mapToGlobal(QPoint()), ""); 
     } 
    } 
} 
return QDialog::eventFilter(target, event); 
} 
3

Определить новый класс

class LoginPassword : public QLineEdit 
{ 
    void eventFilter(QObject *object, QEvent *event) 
    } 

    bool LoginPassword:eventFilter(QObject *object, QEvent *event) 
    { 
    if(event->type() == QEvent::KeyPress) 
    { 
     // Insert your logic here 
    } 
    } 
} 

В eventfilter проверки функции для Keypressed события В этом случае, вы будете в состоянии поймать ситуацию, когда пользователь начинает вводить пароль

Не показывать всплывающее окно. Это плохо. Просто покажите тип всплывающей подсказки, например, в окнах xp или покажите сообщение о состоянии внизу диалогового окна входа в систему

+0

Я не могу найти простой пример применения всплывающей подсказки (и отображения сообщения) к QLineEdit. Кто-то может мне помочь? – Narek

1

Появление сообщения, когда пользователь начинает печатать, не является хорошим стилем юзабилити; Вместо этого я бы сделал это так, как это делается на экране входа в Windows 7, и просто отобразите значок предупреждения и сообщение рядом с полем редактирования пароля в случае нажатия клавиши CAPSLOCK. Имейте в виду, что вы также должны проверить начальное состояние клавиши CAPSLOCK.

Если вы используете Win32 вы можете использовать следующий код, чтобы определить, является ли ключ CAPSLOCK нажат: (::GetKeyState(VK_CAPITAL) & 0x1)

1

Вы можете использовать это, чтобы получить состояние модификаторов клавиатуры (от того, что документов я сказал гавань 't проверял его), но он должен сделать трюк. keyboardModifiers статическая функция, так что вы могли бы назвать его, когда текст в строке редактирования изменен следующим образом:

connect(lineEdit , SIGNAL(textChanged()), this, SLOT(checkCapsLock)); 

и checkCapsLock см, если ее нажатой, я не знаю, если его наилучшим образом, но он должен работать ,

+0

В этой документации я не вижу CapsLock в качестве модификатора клавиатуры –

+0

сообщение в форуме qt с платформой зависит от примера о том, как это сделать http://www.qtforum.org/article/32572/how-to-determine- если-CapsLock-это-на-кроссплатформенная.html Я думаю, что нет встроенного способа в qt, чтобы получить начальное состояние (или я еще не нашел его: D) вы можете получить в окнах с GetKeyState (VK_CAPITAL) – Olorin

+0

да жаль, что я не заметил, что caplock не присутствовать в качестве модификатора клавиатуры странно, но см. мой предыдущий комментарий для решения – Olorin

Смежные вопросы