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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListView и activateWindow - теряется CurrentIndex  (Прочитано 4658 раз)
Marat(Qt)
Гость
« : Апрель 23, 2010, 17:26 »

Создаю свой comboBox. По нажатии кнопки появляется QListView, который к родителю не привязан - т.е. это самостоятельное окно. Окно это без границ и StaysOnTop. При потере фокуса оно автоматически исчезает. Проблема в том, что если при появлении виджета он не получит фокус, то куда бы мы не кликали - фокуса он не потеряет.
Можно конечно показывать его модально, но тогда он не даст щелкнуть по родителю и лишить виджет фокуса.
Казалось бы есть одно простое решение - activateWindow. при вызове этого метода сразу после show - он не срабатывает, но срабатывает по таймеру - через 30 мсек.
Сделав таймер и все остальное - я уже был готов начать использовать получившийся виджет. Но после activateWindow - currentIndex у списка часто переключается на -1.
если включить список и скрыть его, не поменяв currentIndex - то как правило, currentIndex не меняется на -1, но если мы вдруг поменяли current, вероятность потери индекса почти 100%, а это для меня критично

p.s. Дополню:
потеря текущего итема происходит если:
1) мы щелкнули на другой (не текущий) итем, список исчезает(setVisible(false)), жмем на кнопку - список появился, активировался и тут же выделение выбранного элемента пропало (именно после получения фокуса, во в методе, вызывающем activateWindow currentIndex проверялся до и после выполнения activate'а);
2) мы поменяли текущий итем не используя список ("не открывая" его), например прокруткой колеса мыши над lineEdit'ом, после этого показываем список(нажисая всё ту же кнопку) и видим тоже поведение что и в 1).

p.p.s. Вижу пока одно решение: по первому вызову timeOut - запомнить текущий индекс и вызвать activateWindow, по второму - setCurrentIndex. Решение слабое, так же как и использование таймера после show, хотелось бы от всего этого избавиться, но нужен способ
« Последнее редактирование: Апрель 23, 2010, 17:36 от Marat(Qt) » Записан
SABROG
Гость
« Ответ #1 : Апрель 23, 2010, 18:12 »

Разве проблемы не исчезнут сами собой, если выставить QListView флаг Qt::Popup?
Записан
Marat(Qt)
Гость
« Ответ #2 : Апрель 23, 2010, 18:19 »

Разве проблемы не исчезнут сами собой, если выставить QListView флаг Qt::Popup?
Вероятно, но как тогда обработать клик за пределами QListView, пока у меня не получается лишить его фокуса, любой клик в любой области рабочего стола кроме самого списка игнорируется.
Использую Qt::Tool, но он не берет на себя фокус
Записан
Marat(Qt)
Гость
« Ответ #3 : Апрель 23, 2010, 19:36 »

Немного порассуждав, решил что Qt::Popup действительно лучше похож, но нужно как-то переписать mousePressEvent, чтобы клик за пределами этого виджета скрывал его
Записан
SABROG
Гость
« Ответ #4 : Апрель 23, 2010, 19:51 »

Немного порассуждав, решил что Qt::Popup действительно лучше похож, но нужно как-то переписать mousePressEvent, чтобы клик за пределами этого виджета скрывал его

Странно то, что у тебя не скрывает. Его стандартное поведение как раз скрывать. Приаттачил пример, окно скрывается даже если я по рабочему столу кликаю или по кнопке "Пуск".
« Последнее редактирование: Апрель 23, 2010, 20:01 от SABROG » Записан
Marat(Qt)
Гость
« Ответ #5 : Апрель 23, 2010, 20:19 »

Ваша реализация выглядит интересно и работает. Но проблему скрытия я, как ни странно, устранил вот таким вот способом:
Код:
bool CMappedComboBox::eventFilter(QObject *obj, QEvent *e)
{
if(obj==&list)
{
if(e->type()==QEvent::MouseButtonPress)
{
list.setVisible(false);
e->accept();
return true;
}
else return false;
         ...
почему это не скрывает список при клике по нему самому - загадка.
И, кстати, выяснилось, что потеря currentIndex'а вовсе не в activateWindow.. Продолжаю поиски
« Последнее редактирование: Апрель 23, 2010, 20:20 от Marat(Qt) » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Апрель 23, 2010, 21:06 »

>>почему это не скрывает список при клике по нему самому - загадка.
клик - нажатие, затем  отпускание. Я полагаю, что нужно обрабатывать отпускание кнопки мыши.
Записан

Юра.
Marat(Qt)
Гость
« Ответ #7 : Апрель 23, 2010, 23:45 »

Ребус разгадан. Проблема была далеко не в том что было мной описано в первом посте.
Я просто запутался в моделях и не понял что происходит submit. Как я мог так проколоться, ведь все признаки были налицо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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