Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Marat(Qt) от Декабрь 14, 2009, 14:49



Название: QComboBox - отдать фокус родителю
Отправлено: Marat(Qt) от Декабрь 14, 2009, 14:49
Есть виджет, на нем два комбобокса лежат. После работы с комбобоксом (изменение значения выбором в выпадающем списке или просто просмотр списка путем щелкания по самому комбобоксу с целью показать/скрыть список) необходимо вернуть фокус виджету, на котором лежит комбобокс. Например:
connect(ui->tip,SIGNAL(activated(int)),this,SLOT(setFocus()));
где ui->tip - комбобокс. Данный коннект решает половину проблемы, возврат фокуса в случае выбора элемента из выпавшего списка, но если пользователь не щелкал по списку, а закрыл список щелкнув по боксу второй раз, то фокус останется у бокса, что не допустимо.
Судя по всему, сигналы задачу не решат, но очень хочется верить что есть какой-то финт ушами, способный быстро и хитро достигнуть поставленной цели.

Собственно откуда такая задача:
Виджет с двумя комбобоксами - это хитрый делегат, обеспечивающий, на мой взгляд удобное заполнение таблицы. Идея - школы стоят в разных городах, в первом боксе выбираем город, происходит фильтрация и во втором боксе доступны только школы этого города.
Суть проблемы: делегат сохраняет данные в модель только в момент своего исчезновения, но если в фокусе один из комбобоксов делегата а не он сам, то при щелчке на свободную область в tableview или какой-либо виджет вне таблицы делегат не исчезает, а select модели до его исчезновения приводит к исчезновению делегата вместе с произведенными в нем изменениями.


Название: Re: QComboBox - отдать фокус родителю
Отправлено: igor_bogomolov от Декабрь 14, 2009, 16:52
Виджет с двумя комбобоксами - это хитрый делегат, обеспечивающий, на мой взгляд удобное заполнение таблицы. ...
...при щелчке на свободную область в tableview или какой-либо виджет вне таблицы делегат не исчезает, а select модели до его исчезновения приводит к исчезновению делегата вместе с произведенными в нем изменениями.

До конца так и не понял какое точно поведение нужно получить.
Приведу свой пример, надеюсь поможет )
Задача тек же была редактировать данные через QComboBox. При этом, только нажатие Enter фиксирует данные в модели. Любые другие действия должны приводить к откату данных. В том числе и потеря фокуса. Пришлось писать вот такого уродца:
Код
C++ (Qt)
bool ComboBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
   QComboBox * comboBox = static_cast<QComboBox*>(editor);
   if (comboBox) {
       if (event->type() == QEvent::KeyPress) {
           QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
           if(keyEvent->key()==Qt::Key_Tab || keyEvent->key()==Qt::Key_Backtab) {
               emit closeEditor(comboBox, QAbstractItemDelegate::RevertModelCache);
               return true;
           } else if(keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Left) {
               return true;
           }
       } else if (event->type() == QEvent::FocusOut) {
           QWidget * widget = qApp->focusWidget();
           if(!widget) return false;
 
           if (QLatin1String(widget->metaObject()->className()) == QLatin1String("QComboBoxListView") ||
               QLatin1String(widget->metaObject()->className()) == QLatin1String("QComboBox" )) {
               return true;
           }
 
           emit closeEditor(comboBox, QAbstractItemDelegate::RevertModelCache);
           return true;
       }
   }
   return QItemDelegate::eventFilter(editor, event);
}

Вы можете подобным образом отлавливать потерю фокуса, и выполнять свои действия.  :)


Название: Re: QComboBox - отдать фокус родителю
Отправлено: Marat(Qt) от Декабрь 14, 2009, 20:05
Беда в том что мне нужно не отловить потерю фокуса, а заставить combobox потерять его. Но стоит поискать событие закрытия выпадающего списка.


Название: Re: QComboBox - отдать фокус родителю
Отправлено: shadone от Декабрь 14, 2009, 22:24
установка focusProxy не поможет?


Название: Re: QComboBox - отдать фокус родителю
Отправлено: break от Декабрь 14, 2009, 23:35
Цитировать
Беда в том что мне нужно не отловить потерю фокуса, а заставить combobox потерять его.
а если другому виджету сказать setFocus - то комбобокс ведь потеряет его?


Название: Re: QComboBox - отдать фокус родителю
Отправлено: Marat(Qt) от Декабрь 15, 2009, 10:42
Потеряет. Но нужно знать когда терять его. В стандартном комбобоксе нет нужного мне сигнала. Придется писать обработщик события. В общем копать надо.
Надеялся что кто-нибудь копал уже, раз нет - сам буду разбираться. Всем спасибо.


Название: Re: QComboBox - отдать фокус родителю
Отправлено: break от Декабрь 16, 2009, 00:45
А если поставить вашим комбикам focusPlicy = NoFocus - то может получится то поведение которое вы хотите? - а для заполнения с клавиатуры предусмотреть горячие клавиши??? или другой вариант focusPolicy.


Название: Re: QComboBox - отдать фокус родителю
Отправлено: Marat(Qt) от Декабрь 17, 2009, 11:46
Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label


Название: Re: QComboBox - отдать фокус родителю
Отправлено: Alp от Декабрь 17, 2009, 13:50
Разве дополнительное связывание с сигналом currentIndexChanged не решит проблему?


Название: Re: QComboBox - отдать фокус родителю
Отправлено: break от Декабрь 17, 2009, 18:10
Цитировать
Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label
Ошибаешься - ficusPolicy отвечает только за фокус с клавиатуры и никак не связан с мышкой комбобокс работает как и раньше - кинь 2 компбо на форму и нажви предварительный просмотр в дизайнере!!!


Название: Re: QComboBox - отдать фокус родителю
Отправлено: shadone от Декабрь 17, 2009, 19:22
Цитировать
Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label
Ошибаешься - ficusPolicy отвечает только за фокус с клавиатуры и никак не связан с мышкой комбобокс работает как и раньше - кинь 2 компбо на форму и нажви предварительный просмотр в дизайнере!!!
нет, focusPolicy отвечает за любой фокус - см документацию. В случае QComboBox сложность в том что внутри него есть QLineEdit который и получает фокус (а на комбобокс установлен focusProxy). В текущей реализации focusPolicy не наследуются на прокси.


Название: Re: QComboBox - отдать фокус родителю
Отправлено: Marat(Qt) от Декабрь 17, 2009, 20:40
Цитировать
Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label
Ошибаешься - ficusPolicy отвечает только за фокус с клавиатуры и никак не связан с мышкой комбобокс работает как и раньше - кинь 2 компбо на форму и нажви предварительный просмотр в дизайнере!!!
Как оказалось вы были правы. Но на деле мне не удавалось это проверить. Я ставил combobox'ам noFocus и при щелчке по ним мой делегат мгновенно исчезал. Я думал что это не решение проблемы. Дело в том, что виджет, на котором лежали combobox'ы, также был приучен к noFocus, в итоге при первом щелчке по делегату, ни один из его элементов не имел фокуса и делегат исчезал. Я поставил виджету, на котором лежат боксы wheelfocus, а комбобоксам соответственно noFocus. Теперь делегат работает так, как этого ожидает пользователь. Всем спасибо за помощь.

p.s.
Цитировать
Разве дополнительное связывание с сигналом currentIndexChanged не решит проблему?
если после щелчка по комбобоксу текущий индекс не поменяется, то сигнал не будет выслан и бокс останется с фокусом, изначально все так и было, но это явно не то чего я хотел