Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Marat(Qt) от Апрель 23, 2010, 17:26



Название: QListView и activateWindow - теряется CurrentIndex
Отправлено: 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, хотелось бы от всего этого избавиться, но нужен способ


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: SABROG от Апрель 23, 2010, 18:12
Разве проблемы не исчезнут сами собой, если выставить QListView флаг Qt::Popup?


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: Marat(Qt) от Апрель 23, 2010, 18:19
Разве проблемы не исчезнут сами собой, если выставить QListView флаг Qt::Popup?
Вероятно, но как тогда обработать клик за пределами QListView, пока у меня не получается лишить его фокуса, любой клик в любой области рабочего стола кроме самого списка игнорируется.
Использую Qt::Tool, но он не берет на себя фокус


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: Marat(Qt) от Апрель 23, 2010, 19:36
Немного порассуждав, решил что Qt::Popup действительно лучше похож, но нужно как-то переписать mousePressEvent, чтобы клик за пределами этого виджета скрывал его


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: SABROG от Апрель 23, 2010, 19:51
Немного порассуждав, решил что Qt::Popup действительно лучше похож, но нужно как-то переписать mousePressEvent, чтобы клик за пределами этого виджета скрывал его

Странно то, что у тебя не скрывает. Его стандартное поведение как раз скрывать. Приаттачил пример, окно скрывается даже если я по рабочему столу кликаю или по кнопке "Пуск".


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: Marat(Qt) от Апрель 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.. Продолжаю поиски


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: lit-uriy от Апрель 23, 2010, 21:06
>>почему это не скрывает список при клике по нему самому - загадка.
клик - нажатие, затем  отпускание. Я полагаю, что нужно обрабатывать отпускание кнопки мыши.


Название: Re: QListView и activateWindow - теряется CurrentIndex
Отправлено: Marat(Qt) от Апрель 23, 2010, 23:45
Ребус разгадан. Проблема была далеко не в том что было мной описано в первом посте.
Я просто запутался в моделях и не понял что происходит submit. Как я мог так проколоться, ведь все признаки были налицо.