Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Caduceus от Июль 19, 2010, 22:56



Название: Как поймать момент получения фокуса?
Отправлено: Caduceus от Июль 19, 2010, 22:56
Мне надо сделать, чтобы когда встаем на QLineEdit , то сразу бы атоматически селектился весь текст
Переопределил QLineEdit и в focusInEvent вставил selectAll

Не заработало. Куда надо вставить selectAll, чтоб получилось как мне надо?


Название: Re: Как поймать момент получения фокуса?
Отправлено: lit-uriy от Июль 19, 2010, 23:10
может не правильно переопределил?
по идее всё должно работать


Название: Re: Как поймать момент получения фокуса?
Отправлено: Caduceus от Июль 19, 2010, 23:16
Дело в том, что если я ставлю точку останова, то дебагер там останавливается И!!! выделается потом как надо. А если точку останова не ставлю, то не выделяется :)


Название: Re: Как поймать момент получения фокуса?
Отправлено: SimpleSunny от Июль 20, 2010, 11:31
Возможно после focusInEvent приходят еще какие-то события, которые снимают выделение.


Название: Re: Как поймать момент получения фокуса?
Отправлено: blindvic от Декабрь 18, 2010, 12:45
видимо сначала обрабатывается focusInEvent, в котором выделяется весь текст, а потом mouseclick к-й это выделение сбрасывает?


Название: Re: Как поймать момент получения фокуса?
Отправлено: Авварон от Декабрь 18, 2010, 13:13
QTimer::singleShot(0, this, SLOT(selectAll()));


Название: Re: Как поймать момент получения фокуса?
Отправлено: Thanatos от Август 25, 2011, 03:00
Оживим старый труп :)

Цель прежняя: при клике мышью на QLineEdit должен выделяться текст
Фильтр событий отрабатывает, но выделения нет

Код:
bool ChatWindow:: eventFilter(QObject * obj, QEvent * event)
{
    switch(event->type())
    {
    case QEvent::FocusIn :
    {
        if(obj == ui->adressLine || obj == ui->nickName)
            dynamic_cast<QLineEdit*>(obj)->selectAll();
         break;
     }
     //..................
     }
 }


QTimer::singleShot(0, ui->adressLine, SLOT(selectAll()));
QTimer::singleShot(0, ui->nickName, SLOT(selectAll()));
также не помогает

может у кого новый опыт в решении этой проблемы накопился?


Название: Re: Как поймать момент получения фокуса?
Отправлено: LisandreL от Август 25, 2011, 07:33
А вызов оригинального eventFilter там есть?
Покажите полностью код.


Название: Re: Как поймать момент получения фокуса?
Отправлено: Thanatos от Август 25, 2011, 12:58
Вот весь фильтр событий

Код:
bool ChatWindow:: eventFilter(QObject * obj, QEvent * event)
{
switch(event->type())
{
case QEvent::FocusIn :
        {
if(obj == ui->adressLine || obj == ui->nickName)
          dynamic_cast<QLineEdit*>(obj)->selectAll();
break;
        }
case QEvent::MouseButtonRelease :
{
if(obj == ui->connectButton)
          startConnect(!ui->connectButton->isChecked());
break;
}
default: return QWidget::eventFilter(obj , event);
}

return QWidget::eventFilter(obj , event);
}

И в догонку ещё один момент, чтоб новую тему не создавать.
case QEvent::MouseButtonRelease вызывается при нажатии на кнопку ui->connectButton, которая является зажимаемой (setCheckable(true)). Проблема в том, что событие вызывается раньше, чем свойство checked меняет свое значение. (В итоге в мою функцию startConnect(bool checked) приходиться передавать инвертированое значение.) А хотелось бы наоборот!


Название: Re: Как поймать момент получения фокуса?
Отправлено: Thanatos от Август 28, 2011, 18:43
Проблема решена заменой QEvent::FocusIn на QEvent::MouseButtonRelease


Название: Re: Как поймать момент получения фокуса?
Отправлено: Alexandr от Сентябрь 05, 2011, 12:14
Так как QLineEdit все равно переопределять, и ничего нестандартного, кроме выделения текста после получения фокуса не требовалось, то я сделал так:
Код:
#ifndef CUSTOM_LINE_EDIT_H
#define CUSTOM_LINE_EDIT_H

#include <QtGui/QtGui>

class CCustomLineEdit :
public QLineEdit
{
public:
CCustomLineEdit(QWidget *parent=0) : QLineEdit(parent) {};
~CCustomLineEdit(void) {};

protected:
virtual void mouseReleaseEvent(QMouseEvent * e) {
QLineEdit::mouseReleaseEvent(e);
selectAll();
};
};

#endif // CUSTOM_LINE_EDIT_H