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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виртуальная клавиатура не закрывается  (Прочитано 3187 раз)
Zartul
Гость
« : Октябрь 24, 2012, 16:48 »

Доброго времени суток!

Сделал виртуальную клавиатуру по примеру с QInputContext

Вроде все отлично работает, но заметил такую особенность
Если вызвать клавиатуру в модальном диалоговом окне, у которого при создании задан родитель

Код
C++ (Qt)
MyDialog dlg( this ); // parent is set
 
dlg.exec();
 

и после этого закрыть это окно, то для моего класса, наследуемого от QInputContext, в функцию filterEvent присылается
событие QEvent::CloseSoftwareInputPanel, по которому я закрываю и клавиатуру

Код
C++ (Qt)
bool MyInputPanelContext::filterEvent(const QEvent* event)
{
   if (event->type() == QEvent::RequestSoftwareInputPanel) {
       updatePosition();
       inputPanel->show();
       return true;
   } else if (event->type() == QEvent::CloseSoftwareInputPanel) {
       inputPanel->hide();
       return true;
   }
   return false;
}
 

Но! если парент не задан

Код
C++ (Qt)
MyDialog dlg( NULL ); // no parent
 
dlg.exec();
 

то после вызова клавиатуры в таком окне, и его закрытия событие QEvent::CloseSoftwareInputPanel не приходит и следственно клавиатуру я не скрываю

Может сталкивался кто с этой проблемой, или объяснить почему так происходит?
« Последнее редактирование: Октябрь 24, 2012, 17:01 от Zartul » Записан
mutineer
Гость
« Ответ #1 : Октябрь 24, 2012, 16:52 »

1) нельзя объектам на стеке давать родителя - может случиться двойное удаление
Записан
Zartul
Гость
« Ответ #2 : Октябрь 24, 2012, 16:59 »

1) нельзя объектам на стеке давать родителя - может случиться двойное удаление

я знаю, ну код я этот к примеру привел, если надо что бы красиво было пусть там так будет написано Улыбающийся

Код
C++ (Qt)
MyDialog * dlg = MyDialog( this ); // parent is set
 
dlg->exec();
 
« Последнее редактирование: Октябрь 24, 2012, 17:01 от Zartul » Записан
mutineer
Гость
« Ответ #3 : Октябрь 24, 2012, 17:55 »

Так объект без родителя на стеке живет или нет?
Записан
Zartul
Гость
« Ответ #4 : Октябрь 25, 2012, 10:01 »

Так объект без родителя на стеке живет или нет?

все равно в стеке или в куче создано окно, если оно без родителя и закрывается с вызванной виртуальной клавиатурой, событие QEvent::CloseSoftwareInputPanel наследнику QInputContext не присылается

приложил немного модифицированный исходник из экзамплов inputpanel
Если кликнуть по первому радиобатону, то вызывается окно без родителя, если по второму то с родителем.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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