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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox - отдать фокус родителю  (Прочитано 10342 раз)
Marat(Qt)
Гость
« : Декабрь 14, 2009, 14:49 »

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

Собственно откуда такая задача:
Виджет с двумя комбобоксами - это хитрый делегат, обеспечивающий, на мой взгляд удобное заполнение таблицы. Идея - школы стоят в разных городах, в первом боксе выбираем город, происходит фильтрация и во втором боксе доступны только школы этого города.
Суть проблемы: делегат сохраняет данные в модель только в момент своего исчезновения, но если в фокусе один из комбобоксов делегата а не он сам, то при щелчке на свободную область в tableview или какой-либо виджет вне таблицы делегат не исчезает, а select модели до его исчезновения приводит к исчезновению делегата вместе с произведенными в нем изменениями.
Записан
igor_bogomolov
Гость
« Ответ #1 : Декабрь 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);
}

Вы можете подобным образом отлавливать потерю фокуса, и выполнять свои действия.  Улыбающийся
Записан
Marat(Qt)
Гость
« Ответ #2 : Декабрь 14, 2009, 20:05 »

Беда в том что мне нужно не отловить потерю фокуса, а заставить combobox потерять его. Но стоит поискать событие закрытия выпадающего списка.
Записан
shadone
Гость
« Ответ #3 : Декабрь 14, 2009, 22:24 »

установка focusProxy не поможет?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #4 : Декабрь 14, 2009, 23:35 »

Цитировать
Беда в том что мне нужно не отловить потерю фокуса, а заставить combobox потерять его.
а если другому виджету сказать setFocus - то комбобокс ведь потеряет его?
Записан
Marat(Qt)
Гость
« Ответ #5 : Декабрь 15, 2009, 10:42 »

Потеряет. Но нужно знать когда терять его. В стандартном комбобоксе нет нужного мне сигнала. Придется писать обработщик события. В общем копать надо.
Надеялся что кто-нибудь копал уже, раз нет - сам буду разбираться. Всем спасибо.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Декабрь 16, 2009, 00:45 »

А если поставить вашим комбикам focusPlicy = NoFocus - то может получится то поведение которое вы хотите? - а для заполнения с клавиатуры предусмотреть горячие клавиши??? или другой вариант focusPolicy.
Записан
Marat(Qt)
Гость
« Ответ #7 : Декабрь 17, 2009, 11:46 »

Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label
Записан
Alp
Гость
« Ответ #8 : Декабрь 17, 2009, 13:50 »

Разве дополнительное связывание с сигналом currentIndexChanged не решит проблему?
« Последнее редактирование: Декабрь 17, 2009, 16:05 от Dendy » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Декабрь 17, 2009, 18:10 »

Цитировать
Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label
Ошибаешься - ficusPolicy отвечает только за фокус с клавиатуры и никак не связан с мышкой комбобокс работает как и раньше - кинь 2 компбо на форму и нажви предварительный просмотр в дизайнере!!!
Записан
shadone
Гость
« Ответ #10 : Декабрь 17, 2009, 19:22 »

Цитировать
Если поставить NoFocus, то не будет выпадающего списка и комбо будет не лучше чем label
Ошибаешься - ficusPolicy отвечает только за фокус с клавиатуры и никак не связан с мышкой комбобокс работает как и раньше - кинь 2 компбо на форму и нажви предварительный просмотр в дизайнере!!!
нет, focusPolicy отвечает за любой фокус - см документацию. В случае QComboBox сложность в том что внутри него есть QLineEdit который и получает фокус (а на комбобокс установлен focusProxy). В текущей реализации focusPolicy не наследуются на прокси.
Записан
Marat(Qt)
Гость
« Ответ #11 : Декабрь 17, 2009, 20:40 »

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

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


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