Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Evgeniya от Март 12, 2009, 11:19



Название: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 11:19
Помогите, плииииз, написать сигнал для QLineEdit на получение фокуса ввода клавиатуры...т.е. мне нужно, чтобы он сразу сработал, когда курсор переходит на QLineEdit просто из стандартных никакой не подходит как мне кажется... ???


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: BRE от Март 12, 2009, 11:25
Помогите, плииииз, написать сигнал для QLineEdit на получение фокуса ввода клавиатуры...т.е. мне нужно, чтобы он сразу сработал, когда курсор переходит на QLineEdit просто из стандартных никакой не подходит как мне кажется... ???
Тут тебе эвенты помогут. Смотри virtual void QWidget::focusInEvent ( QFocusEvent * event ).
Также сразу посмотри про void QObject::installEventFilter ( QObject * filterObj ).


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: spirit от Март 12, 2009, 11:36
[offtop]
где-то я такое уже встречал на форуме :)
[/offtop]


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 13:41
Тут тебе эвенты помогут. Смотри virtual void QWidget::focusInEvent ( QFocusEvent * event ).
Также сразу посмотри про void QObject::installEventFilter ( QObject * filterObj ).


virtual void QWidget::focusInEvent ( QFocusEvent * event ) будет относиться же ко всему классу...а чтобы отобрать нужный объект мне нужно воспользоваться void QObject::installEventFilter ( QObject * filterObj )....я так понимаю

И вот я пытаюсь так сделать

Код
C++ (Qt)
void QMainWindow::focusInEvent(QFocusEvent * event){
ui.lineEdit_2->installEventFilter(this);
QMessageBox::information(0,"Information","фокус ввода получен");
}

Код
C++ (Qt)
bool QMainWindow::eventFilter(QObject *obj, QEvent *ev){
if (obj == ui.lineEdit_2) {
           if (ev->type() == QEvent::FocusIn) {
               return true;
           } else {
               return false;
           }
       } else {
           // пересылка сообщения родительскому классу
           return raskladka::eventFilter(obj, ev);
       }
 
}

но толко у меня все-равно ничего не получается, возможно я не правильно понимаю это...посмотрите, пожалуйста


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 14:14
чет я совсем запуталась...и похожей темы сдеся не найду  >:(


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: uriel от Март 12, 2009, 14:58
Вы почти на правильном пути. :) Только установку фильтра можно проводить сразу в конструкторе родительского виджета.
Код
C++ (Qt)
MainWindow::MainWindow() {
  ui.lineEdit_2->installEventFilter(this);
}
 
bool MainWindow::eventFilter(QObject *obj, QEvent *ev){
  if (obj == ui.lineEdit_2 && ev->type() == QEvent::FocusIn)
              QMessageBox::information(0, "Information", "Фокус ввода получен");
 
  return MainWindow::eventFilter(obj, ev);
}
 


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 16:34
Спасибочки!!!
работает так

Код
C++ (Qt)
bool MainWindow::eventFilter(QObject *obj, QEvent *ev){
if (obj == ui.lineEdit_2 ){
if(ev->type() == QEvent::FocusIn){
           QMessageBox::information(0, "Information", "Фокус ввода получен");
           return true;
}
else return false;
}
else return MainWindow::eventFilter(obj, ev);
}
а в конструкторе вызываем
ui.lineEdit_2->installEventFilter(this);

только вот это сообщение постоянно выскакивает и его невозможно закрыть...ну что здесь не так ???


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 16:42
т.е. постоянно выполняется:
QMessageBox::information(0, "Information", "Фокус ввода получен");


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: BRE от Март 12, 2009, 16:53
т.е. постоянно выполняется:
QMessageBox::information(0, "Information", "Фокус ввода получен");
:)
Потому что после закрытия MessageBox фокус передеается твоему QLineEdit и все повторяется, т.е. снова открывается MessageBox.


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 17:02
А если выполнять другое действие вместо этого, или вообще ничего не выплнять...то пропадает сам курсор..все пишется, только курсора не видно  >:(
это правильно, так и должно быть??


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: spirit от Март 12, 2009, 17:20
нет так быть не должно. я такое тоже замечал.


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: BRE от Март 12, 2009, 17:22
А если выполнять другое действие вместо этого, или вообще ничего не выплнять...то пропадает сам курсор..все пишется, только курсора не видно  >:(
это правильно, так и должно быть??
Так не должно быть.
В ветке, где ты проводишь обработку убери QMessageBox и вместо return true делай return false.

Для информации: Возвращая true, ты говоришь Qt что дальнейшую обработку этого события проводить не надо. А по этому событию, как раз и произодятся необходимые настройки QLineEdit.


Название: Re: сигнал для QLineEdit на получение фокуса ввода клавиатуры
Отправлено: Evgeniya от Март 12, 2009, 17:57
Спасибочкии всем огромное!!!!!Все получилось!!!!!!! :) :) :)