Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: admsasha от Мая 22, 2014, 07:09



Название: qlineedit событие при потери фокуса
Отправлено: admsasha от Мая 22, 2014, 07:09
Как отловить потерю и получение фокуса у QLineEdit ?


Название: Re: qlineedit событие при потери фокуса
Отправлено: Johnik от Мая 22, 2014, 07:18
Код
C++ (Qt)
void QWidget::focusInEvent(QFocusEvent * event) [virtual protected]
void QWidget::focusOutEvent(QFocusEvent * event) [virtual protected]


Название: Re: qlineedit событие при потери фокуса
Отправлено: Igors от Мая 22, 2014, 09:26
Чтобы не плодить темы - вспомнилась еще одна деталь с QLineEdit.

Пример: в немодальном диалоге юзер вводит текст в QLineEdit. Немедленно реагировать (на каждый символ) часто плохо, если приличные действия по приему - будет мельтешение/залипание. Нужна задержка, напр если в течение 0.5 сек (задается) не последовало еще ввода - принять данные.

Вопрос: это самому делать или можно чем-то воспользоваться ?

Спасибо 


Название: Re: qlineedit событие при потери фокуса
Отправлено: Johnik от Мая 22, 2014, 09:51
Вопрос: это самому делать или можно чем-то воспользоваться ?
я сам делал (псевдокод (qt5)):
Код
C++ (Qt)
QLineEdit *someLineEdit = ...
 
QTimer *changeTimer = new QTimer(someLineEdit);
changeTimer.setInterval(500);
changeTimer.setSingleShot(true);
 
QObject::connect(someLineEdit, &QLineEdit::textChanged,
   [changeTimer] () { changeTimer->start(); }
);
QObject::connect(changeTimer, &QTimer::timeout,
   [this, someLineEdit] () {
       emit this->aboutTextChanged(someLineEdit->text());
   }
);
 

вопрос в силе, может есть готовое решение?


Название: Re: qlineedit событие при потери фокуса
Отправлено: Igors от Мая 22, 2014, 10:10
я сам делал (псевдокод (qt5)):
Там еще надо застрелить таймер если фокус соскочил или Enter, т.е. когда по-любому надо принять. Ну и edit'ов совсем не один. В общем "налипает" довольно много кода


Название: Re: qlineedit событие при потери фокуса
Отправлено: Johnik от Мая 22, 2014, 10:18
Там еще надо застрелить таймер если фокус соскочил или Enter
зачем, singleShot же?


Название: Re: qlineedit событие при потери фокуса
Отправлено: Johnik от Мая 26, 2014, 08:19
наткнулся:
Код
C++ (Qt)
void QLineEdit::editingFinished() [signal]
Цитировать
This signal is emitted when the Return or Enter key is pressed or the line edit loses focus. Note that if there is a validator() or inputMask() set on the line edit and enter/return is pressed, the editingFinished() signal will only be emitted if the input follows the inputMask() and the validator() returns QValidator::Acceptable.


Название: Re: qlineedit событие при потери фокуса
Отправлено: Bepec от Мая 26, 2014, 09:03
Не всегда editingFinished присылается. (Qt 4.7.2)

PS информационный блок :)


Название: Re: qlineedit событие при потери фокуса
Отправлено: Igors от Мая 26, 2014, 09:17
наткнулся:
Код
C++ (Qt)
void QLineEdit::editingFinished() [signal]
Цитировать
This signal is emitted when the Return or Enter key is pressed or the line edit loses focus. Note that if there is a validator() or inputMask() set on the line edit and enter/return is pressed, the editingFinished() signal will only be emitted if the input follows the inputMask() and the validator() returns QValidator::Acceptable.
Ну да, если этот сигнал получен - с таймером надо что-то делать. А использовать только этот сигнвл (игнорировать текущий ввод) тоже не выход, т.к. заставляет юзера все время лупить Enter


Название: Re: qlineedit событие при потери фокуса
Отправлено: Bepec от Мая 26, 2014, 09:29
Причем добавлю - именно Enter на основной клавиатуре. На дополнительной уже не работает :)


Название: Re: qlineedit событие при потери фокуса
Отправлено: Johnik от Мая 26, 2014, 09:42
проверил только что, работает как на основной так и на дополнительной, т.е. Enter и Return


Название: Re: qlineedit событие при потери фокуса
Отправлено: Bepec от Мая 26, 2014, 11:10
Скажу заранее спасибо, только отпишитесь какая версия Qt. Шоп я знал :)


Название: Re: qlineedit событие при потери фокуса
Отправлено: Johnik от Мая 26, 2014, 11:43
qt5 (5.2.1, 5.3.0) изначально, теперь проверил и на qt4 (4.8.5)


Название: Re: qlineedit событие при потери фокуса
Отправлено: Bepec от Мая 26, 2014, 14:20
Оукей, ещё раз спасибо.