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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Отключить Popup закрытие при клике в другое окно  (Прочитано 12728 раз)
kuzmich
Гость
« : Февраль 15, 2011, 16:16 »

Есть окно с QLineEdit в котором вываливается popup список при начале ввода. И есть одновременно возникающее окно виртуальной клавиатуры, при нажатии на кнопки в которой в поле QLineEdit посылается insert(Qt::Key_1...0). Так проблема в том, что при вводе 3-х значного числа приходится нажимать 5 раз! из-за того, что каждое второе нажатие на виртуальное клаве съедается закрытием popup окна completer`а. F1! Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраль 15, 2011, 16:19 »

Скорее всего не получится, т.к. при таком popup-e делается граб.
« Последнее редактирование: Февраль 15, 2011, 16:22 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
kuzmich
Гость
« Ответ #2 : Февраль 15, 2011, 16:28 »

Пытался отловить события с помощью eventFilter(), что-то ни фига не получилось. Не связаны ли такого рода события с оконным менеджером? Если да, то как их поймать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Февраль 15, 2011, 16:47 »

Цитировать
Не связаны ли такого рода события с оконным менеджером? Если да, то как их поймать?
Вполне возможно, что через NET_WM и в этом случае просто так вы их не поймаете.

А QLineEdit и "виртуальная клавиатура" это виджеты одного приложения?
Записан

Qt 5.11/4.8.7 (X11/Win)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Февраль 15, 2011, 17:05 »

Хотя нет, я не прав.
QCompleter для popup-а использует окна типа Qt::Popup, а в этом случае окна создаются с флагом OverrideRedirect, т.е. минуя WM.
См. QApplication::activePopupWidget():
Цитировать
A popup widget is a special top-level widget that sets the Qt::WType_Popup widget flag, e.g. the QMenu widget. When the application opens a popup widget, all events are sent to the popup. Normal widgets and modal widgets cannot be accessed before the popup widget is closed.

Т.е. скорее всего, что-то не так проверяете в eventFilter(). Кстати чей перегрузили?
Записан

Qt 5.11/4.8.7 (X11/Win)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Февраль 15, 2011, 17:33 »

А отключить автодополнение?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
asvil
Гость
« Ответ #6 : Февраль 15, 2011, 18:41 »

Вот так GUI нынче пошла... Знали ли эти студенты из ксерокса, насколько серьезно воспримут их придумку. "И будет нам компьютер образы рисовать, как будто художник на мольберте". А Вы не пробовали в popup еще табличку засунуть в каждую ячейку таблички еще комбобокс, а в него табличку....
Простите вырвалось, к Вам отношение никакого не имеет, просто на работе "интересные" задачи ставят.

Записан
kuzmich
Гость
« Ответ #7 : Февраль 15, 2011, 21:08 »

2GreatSnake:
Пытался установить ParentWindow::eventFilter родительского окна для popup`a полученного QCompleter::popup(), типо:
QAbstractItem* mypopup =  qcompleter->popup();
mypopup->installEventFilter(this); // функцию родителя использую для ловли событий
qcompleter->setPopup(mypopup);
 А в функции родиля eventFilter() выводил события, которые ловились, надеялся увидеть что-то типо потери фокуса. Но там только show и т.д.

2pastor:
а что даст отключение автодополнения? Мне же именно оно и нужно. Только, чтобы при переключении фокуса popup не съедало клик и не пропадало.

2 Филоненко Михаил:
а где вы сложность несусветную нашли? На устройстве с тачскрином нужно пальцами набрать код, расшифровка которого вываливается, подсказывая оператору. Вроде бы логично показать на экране виртуальную клаву Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Февраль 15, 2011, 21:42 »

> а что даст отключение автодополнения? Мне же именно оно и нужно. Только, чтобы при переключении фокуса popup не съедало клик и не пропадало.

я подумал, что оно не нужно вовсе ))


Попробуй перед insert(Qt::Key_1...0) устанавливать фокус в QLineEdit
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
asvil
Гость
« Ответ #9 : Февраль 15, 2011, 22:29 »

Вы уверены, что расшифровываемая информация должна быть выполнена в виде отдельного окна? Если я правильно понимаю принципы popup - это модальное окно, tooltip - не модальное.
Возможно focus proxy в чем-то поможет. Возможно поможет просмотр исходников QComboBox, я когда-то просто его копировал, для своих нужд.
« Последнее редактирование: Февраль 15, 2011, 22:31 от Филоненко Михаил » Записан
kuzmich
Гость
« Ответ #10 : Февраль 16, 2011, 09:18 »

Фокус устанавливаю, но проблема как раз в переключении фокуса на виртуальную клаву.

Хотелось бы, чтобы подсказка максимум на 10 элементов вываливалась именно из поля QLineEdit, а вот в отдельном окне как раз и не хочется. Хотя может и придется, если не победю траблу. А вот с tooltip, т.е. не модальным выпрыгивающим окном, может и идея. Похоже мне нужно сделать именно не модальное. Пойду пробовать...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Февраль 16, 2011, 10:38 »

Перегружать нужно QCompleter::eventFilter().
Записан

Qt 5.11/4.8.7 (X11/Win)
kuzmich
Гость
« Ответ #12 : Февраль 16, 2011, 11:10 »

Пробовал, но свойство съедания клика popup окном не удалось исключить. Может что-то не так делал....
По-моему нашел способ ловить все события в приложении. Установить eventFilter() на QApplication. Так я от максимизации окон избавился и сложно, но можно замутить блокировку потери фокуса popup окна. Буду рыть-ковырять далее...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Февраль 16, 2011, 11:15 »

Цитировать
Пробовал, но свойство съедания клика popup окном не удалось исключить. Может что-то не так делал....
Странно, т.к. в QCompleter::eventFilter():
Код
C++ (Qt)
...
case QEvent::MouseButtonPress: {
...
if (!d->popup->underMouse()) { // прячем popup, если ткнули не на его окно
d->popup->hide();
return true;
}
}
...
 
Записан

Qt 5.11/4.8.7 (X11/Win)
kuzmich
Гость
« Ответ #14 : Февраль 16, 2011, 15:03 »

И точно! Реимплементил QCompletter с функцией eventFilter(), получилось заблокировать скрытие popup окна. В самом начале начал с этого, невнимательно код почитал и начал другие пути искать. Блин Улыбающийся Теперь осталось из этой функции сгенерировать событие для виртуальной клавы, чтобы она нажала кнопку. Делал postEvent("клава",Qt::MouseButtonClick), QMouseEvent... - либо никакого эффекта, либо какое-то зацикливание в заморозкой всего.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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