Russian Qt Forum
Ноябрь 24, 2024, 14:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запретить дальнейшую передачу события  (Прочитано 5612 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Март 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 чего-то подходящее может, или что-нибудь другое в этом же духе.
« Последнее редактирование: Март 03, 2011, 18:30 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
shirushizo
Гость
« Ответ #1 : Март 03, 2011, 19:32 »

Дальше ничего передаваться и не должно, диалог не должен закрываться. Где-то вы намудрили.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Март 03, 2011, 19:36 »

Дальше ничего передаваться и не должно, диалог не должен закрываться. Где-то вы намудрили.
там всё слишком просто чтобы мудрить Подмигивающий
Записан

kubuntu/Win7/x64/NetBeans
Kolobok
Гость
« Ответ #3 : Март 03, 2011, 20:06 »

То есть юзер кликает по кнопке закрытия и окно закрывается? И это тебя удивляет?
Записан
shirushizo
Гость
« Ответ #4 : Март 04, 2011, 10:34 »

Пользователь кликает по закрытию QMessageBox'а и он закрывается вместе диалогом. Это либо криво щелкнул, либо мистика=)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Март 04, 2011, 11:24 »

Попрубуй QApplication::removePostedEvents( your_dialog );

Хотя, имхо, это моветон, т.к. получается неоднозначное поведение.
Как ты определишь - случайно юзер нажал на кнопку закрытия или осознанно?
« Последнее редактирование: Март 04, 2011, 11:37 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Sahab
Гость
« Ответ #6 : Март 04, 2011, 15:15 »

а компилябельный пример можно?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Март 04, 2011, 22:11 »

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

kubuntu/Win7/x64/NetBeans
Kolobok
Гость
« Ответ #8 : Март 04, 2011, 22:27 »

Логичнее разруливать эту ситуацию в слоте accept() диалога.

А вот это совсем плохо
Код:
QLineEdit* le = qobject_cast<QLineEdit*>(sender());
if (le->text().size() > 0)
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Март 04, 2011, 22:39 »

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

kubuntu/Win7/x64/NetBeans
Kolobok
Гость
« Ответ #10 : Март 04, 2011, 22:46 »

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

Что будет, если sender() не QLineEdit*?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #11 : Март 04, 2011, 22:48 »

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

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

Ничего, т.к. им не может быть никто другой Улыбающийся. С этим слотом завязаны только QLineEdit'ы. И не жить на момент вызова он не может, т.к. является частью гуя, формирующегося в момент вызова диалога.
« Последнее редактирование: Март 04, 2011, 22:52 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Март 05, 2011, 11:01 »

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

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.147 секунд. Запросов: 23.