Потеря фокуса QTableWidget



  • Здравствуйте. Есть форма, на которой расположен QTableWidget и другие элементы управления. Есть обработчик смены текущей ячейки, который превращает текущую ячейку в комбобокс, а предыдущую - в QLabel. Проблема в том, что когда ячейки теряют фокус (клик по другим органам управления окна, клик по свободной области таблицы без ячеек) сигнал о смене текущей ячейки не приходит, и последняя выбранная ячейка остается выглядеть в виде комбобокса. Подскажите, как отследить такую ситуацию с потерей фокуса ячейками таблицы (именно ячейками, так как в самой таблице есть свободное место без ячеек)?

    P.S. перегрузка метода focusOutEvent комбобокса не помогла, так как событие происходит тогда, когда не надо, и не происходит тогда, когда надо.



  • Если я не ошибаюсь то в QTableWidget есть сигнал "itemSelectionChanged":http://qt-project.org/doc/qt-5/qtablewidget.html#itemSelectionChanged он посылается даже когда клик приходит на свободное место.

    Для отлова клика по заголовку таблицы можно использовать "sectionClicked":http://qt-project.org/doc/qt-5/qheaderview.html#sectionClicked

    Для отслеживания выхода фокуса из таблицы надо переписть "focusOutEvent":http://qt-project.org/doc/qt-5/qwidget.html#focusOutEvent для QTableWidget

    Но возмжно, что придётся-таки писать свой TableWidget от QTableView, чтобы поймать все евенты.



  • andreyc, спасибо, унаследовал таблицу и доработал. Но пока остался один вопрос: при выпадении списка комбобокса таблица теряет фокус. Как можно различить события реальной потери фокуса и потери фокуса при выпадении списка комбобокса? В комбобоксе что-то не нашел подходящего сигнала...



  • Ничего кроме таймера мне в голову не приходит.
    На выходе фокуса из таблицы запускаете "QTimer":http://qt-project.org/doc/qt-5/qtimer.html и в этом таймере делаете то что надо делать когда таблица теряет фокус.
    На входе фокуса в "QComboBox":http://qt-project.org/doc/qt-5/qcombobox.html делаете одно из двух

    • выставляете флаг в вашем табличном классе о том что вы ещё тут и в таймере не делаете ничего если флаг выставлен
    • говорите таблице остановить QTimer


  • andreyc, большое спасибо! Сделал с остановом таймера. Решение работает, кроме одного случая, когда открылся комбобокс, а затем закрылся. При перемещении на другой элемент управления вне таблицы фокус остается на самом комбобоксе, хотя он визуально и закрыт.

    P.S. извиняюсь за задержку с ответом.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.