Как узнать, получил ли QLineEdit фокус? - PullRequest
4 голосов
/ 10 июня 2010

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

void QLineEdit::focusInEvent ( QFocusEvent * e )   [virtual protected]

Как мне это сделать?

Также, скажите, пожалуйста, как использовать функцию focusInEvent(), чтобы узнать, получил ли фокус QLineEdit myEdit; объект.

РЕДАКТИРОВАТЬ: Я написал следующую функцию:

bool LoginDialog::eventFilter(QObject *target, QEvent *event)
{
    if (target == m_passwordLineEdit)
    {
        if (event->type() == QEvent::FocusIn)
        {
            if(checkCapsLock())
            {
                QMessageBox::about(this,"Caps Lock", "Your caps lock is ON!");

            }
            return true;

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

И зарегистрировали m_passwordLineEdit в LoginDialog конструкторе класса следующим образом:

m_passwordLineEdit->installEventFilter(this);

И он попадает в бесконечный цикл MessageBox-ов. Пожалуйста, помогите мне разрешить эту ситуацию. На самом деле я хотел бы реализовать эту функцию с помощью всплывающего окна (не с QMessageBox). Можно ли использовать QLabel для этой необходимости?

Ответы [ 3 ]

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

Также, скажите, пожалуйста, как использовать функцию focusInEvent (), чтобы узнать, является ли QLineEdit myEdit;объект получил фокус.

Вы должны подключиться к следующему СИГНАЛУ:

void QApplication::focusChanged ( QWidget * old, QWidget * now )   [signal]

Когда новый QWidget является вашим QLineEdit, вы знаете, что он имеет фокус!* Надеюсь, это поможет!

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

Примерно так:

class YourWidget : public QLineEdit
{
    Q_OBJECT

    protected:

    void focusInEvent(QFocusEvent* e);
};

В файле .cpp:

void YourWidget::focusInEvent(QFocusEvent* e)
{
    if (e->reason() == Qt::MouseFocusReason)
    {
      // The mouse trigerred the event
    }

    // You might also call the parent method.
    QLineEdit::focusInEvent(e);
}

Вы можете найти список всех возможных причин на этой странице .

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

Если вы хотите знать, когда кто-то нажимает на виджет, вы должны переопределить mousePressEvent (QMouseEvent* event). focusInEvent может вызываться другими источниками, кроме щелчка мыши.

Например:

class MyLineEdit : public QLineEdit
{
        Q_OBJECT
    public:
        //...
    protected:
         void mousePressEvent(QMouseEvent* event)
         {
              //pass the event to QLineEdit
              QLineEdit::mousePressEvent(event);
              //register the click or act on it
         }
};

Если вы хотите знать, когда ваш виджет получает фокус, сделайте то же самое с focusInEvent, конечно.

...