Qt - диалог входа в систему - PullRequest
2 голосов
/ 10 июня 2010

Я хочу создать диалог входа в систему, унаследовав QDialog. Я положил в подкласс с именем LoginDialog 2 QLineEdits:

  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);
}

МОЙ ВОПРОС: Как реализовать эту функцию ???

Ответы [ 4 ]

3 голосов
/ 10 июня 2010

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

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 Таким образом, вы сможете поймать ситуацию, когда пользователь начнет вводить пароль

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

1 голос
/ 10 июня 2010

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

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

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

1 голос
/ 10 июня 2010

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

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

0 голосов
/ 11 июня 2010
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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...