Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: serg_hd от Март 03, 2011, 18:19



Название: Запретить дальнейшую передачу события
Отправлено: serg_hd от Март 03, 2011, 18:19
Всем превед, есть QLineEdit, который связан своим сигналом editingFinished() с определённым слотом, в котором идёт проверка содержимого этого поля ввода:
Код
C++ (Qt)
void MyClass::MySlot()
{
QLineEdit* le = qobject_cast<QLineEdit*>(sender());
if (le->text().size() > 0)
{
 QMessageBox::warning(this, "xxx", "yyy!");
 le->setFocus();
}
}
 

Сигнал испускается тогда, когда человек ввёл текст и кликнул на форме (фокус с поля ввода пропадает).
Оно бы всё хорошо, но если перед вызовом слота курсор стоял над кнопкой закрытия диалога (на котором расположен этот QLineEdit), то после закрытия QMessageBox'а сам диалог тоже закрывается, т.е. клик мышей передался дальше на кнопку. Можно ли как-то запретить передачу евента на кнопку закрытия диалога без использования eventFilter'ов и перегрузки соотв. метода у кнопки закрытия диалога? Может qApp чего-то подходящее может, или что-нибудь другое в этом же духе.


Название: Re: Запретить дальнейшую передачу события
Отправлено: shirushizo от Март 03, 2011, 19:32
Дальше ничего передаваться и не должно, диалог не должен закрываться. Где-то вы намудрили.


Название: Re: Запретить дальнейшую передачу события
Отправлено: serg_hd от Март 03, 2011, 19:36
Дальше ничего передаваться и не должно, диалог не должен закрываться. Где-то вы намудрили.
там всё слишком просто чтобы мудрить ;)


Название: Re: Запретить дальнейшую передачу события
Отправлено: Kolobok от Март 03, 2011, 20:06
То есть юзер кликает по кнопке закрытия и окно закрывается? И это тебя удивляет?


Название: Re: Запретить дальнейшую передачу события
Отправлено: shirushizo от Март 04, 2011, 10:34
Пользователь кликает по закрытию QMessageBox'а и он закрывается вместе диалогом. Это либо криво щелкнул, либо мистика=)


Название: Re: Запретить дальнейшую передачу события
Отправлено: GreatSnake от Март 04, 2011, 11:24
Попрубуй QApplication::removePostedEvents( your_dialog );

Хотя, имхо, это моветон, т.к. получается неоднозначное поведение.
Как ты определишь - случайно юзер нажал на кнопку закрытия или осознанно?


Название: Re: Запретить дальнейшую передачу события
Отправлено: Sahab от Март 04, 2011, 15:15
а компилябельный пример можно?


Название: Re: Запретить дальнейшую передачу события
Отправлено: serg_hd от Март 04, 2011, 22:11
Если ввести в поле текст и потом нажать на кнопку закрытия окна, то вылезет QMessageBox (значит сигнал editingFinished() QLineEdit'а шлётся раньше, чем сигнал pressed() кнопки). Вопрос в том, как в слоте MainWindow::mySlot() отменить закрытие окна до следующего нажатия кнопки без фильтрации евентов самой кнопки - неохота ради такой ерунды расписывать условия.


Название: Re: Запретить дальнейшую передачу события
Отправлено: Kolobok от Март 04, 2011, 22:27
Логичнее разруливать эту ситуацию в слоте accept() диалога.

А вот это совсем плохо
Код:
QLineEdit* le = qobject_cast<QLineEdit*>(sender());
if (le->text().size() > 0)


Название: Re: Запретить дальнейшую передачу события
Отправлено: serg_hd от Март 04, 2011, 22:39
А вот это совсем плохо
Код:
QLineEdit* le = qobject_cast<QLineEdit*>(sender());
if (le->text().size() > 0)
Мне это ничем не машает. А на всякие убеждения вроде того, что код выше не соответствует идеологии сигнал-слотов и при этом нет адекватного объяснения - внимания не обращаю


Название: Re: Запретить дальнейшую передачу события
Отправлено: Kolobok от Март 04, 2011, 22:46
А вот это совсем плохо
Код:
QLineEdit* le = qobject_cast<QLineEdit*>(sender());
if (le->text().size() > 0)
Мне это ничем не машает.

Что будет, если sender() не QLineEdit*?


Название: Re: Запретить дальнейшую передачу события
Отправлено: serg_hd от Март 04, 2011, 22:48
А вот это совсем плохо
Код:
QLineEdit* le = qobject_cast<QLineEdit*>(sender());
if (le->text().size() > 0)
Мне это ничем не машает.

Что будет, если sender() не QLineEdit*?

Ничего, т.к. им не может быть никто другой :). С этим слотом завязаны только QLineEdit'ы. И не жить на момент вызова он не может, т.к. является частью гуя, формирующегося в момент вызова диалога.


Название: Re: Запретить дальнейшую передачу события
Отправлено: GreatSnake от Март 05, 2011, 11:01
Цитировать
Вопрос в том, как в слоте MainWindow::mySlot() отменить закрытие окна до следующего нажатия кнопки без фильтрации евентов самой кнопки - неохота ради такой ерунды расписывать условия.
Так пробовал QApplication::removePostedEvents( le->window() ) или нет?