Перехват нажатий клавиш в QTableWidget |
Здравствуйте, гость ( Вход | Регистрация )
Перехват нажатий клавиш в QTableWidget |
alzasr |
17.10.2011, 14:25
Сообщение
#1
|
Студент Группа: Участник Сообщений: 21 Регистрация: 6.10.2011 Пользователь №: 2926 Спасибо сказали: 0 раз(а) Репутация: 0 |
Мне нужно перехватывать все нажатия клавиш в QTableWidget и после анализа либо что-то сделать (в основном изменить фокус ввода) либо передать событие дальше на обработку.
Погуглив нашел 2 варианта. 1. Насловаться от QTableWidget, переопределить keyPressEvent 2. использовать eventFilter Опробовал оба способа, но не все клавиши перехватываются. При редактировании ячейки не реагирует на нажатие стрелок влево-вправо, а вверх-вниз все норм. Я так понимаю, что какой-то виджет, отвечающий за ячейку, перехватывает события и если события ей подходят, то прерывают цепочку. У QTableWidgetItem нет installEventFilter и keyPressEvent, как я понял по исходникам это не QWidget. Подскажите, где копать или где я неправ. |
|
|
alzasr |
17.10.2011, 15:29
Сообщение
#2
|
Студент Группа: Участник Сообщений: 21 Регистрация: 6.10.2011 Пользователь №: 2926 Спасибо сказали: 0 раз(а) Репутация: 0 |
Почитав маны нашел, что при редактировании делегатом создается виджет, который и отображается. Как вариант можно создать свой делегат со своим виджетом, который и будет сигнализировать о событии нажатия клавиши. Но мне кажется есть другой способ, более элегантный. У делегата есть метод создающий виджет и возвращающий ссылку на него QWidget *createEditor. У виджета есть installEventFilter. Нужно наследоваться от QTableWidget и переопределить метод, вызывающий createEditor у делегата и назначать созданному виджету фильтр событий. Вопрос теперь такой: какой метод надо переопределять? Если кто-нибудь знает, ответьте, я пока буду исходники читать.
|
|
|
alzasr |
18.10.2011, 7:49
Сообщение
#3
|
Студент Группа: Участник Сообщений: 21 Регистрация: 6.10.2011 Пользователь №: 2926 Спасибо сказали: 0 раз(а) Репутация: 0 |
Из того что нашел в исходниках. Экземпляр виджета редактирования создается в методе QWidget *QAbstractItemViewPrivate::editor, который возвращает ссылку на созданый метод. Этот метод используется в void QAbstractItemView::openPersistentEditor вот в этом куске
и сохраняется в d, что это за класс пока не знаю, но он недоступен из потомка QTableWidget. Вообще в QAbstractItemViewPrivate::editor созданному виджету устанавливается делегат в качестве обработчика событий. Механизм обработчиков событий я досканально пока не знаю, но возможно это можно будет использовать, если событие переданное обработчику событий является событием для обработчика (охтеж какая конструкция получилась), то можно будет делегату назначить обработчиком таблицу, а для таблицы уже есть обработчик, таким образом событие "всплывет" до нужного обработчика. Проверю, отпишусь. |
|
|
alzasr |
19.10.2011, 13:06
Сообщение
#4
|
Студент Группа: Участник Сообщений: 21 Регистрация: 6.10.2011 Пользователь №: 2926 Спасибо сказали: 0 раз(а) Репутация: 0 |
У QTableWidget есть массив cellWidget, который содержит созданные виджеты ячеек. Им можно назначать eventFilter. Вопрос решен.
|
|
|
Denis.Rassvetniy |
19.11.2011, 22:17
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 22.9.2011 Пользователь №: 2899 Спасибо сказали: 0 раз(а) Репутация: 0 |
Как вариант можно создать делегат, например FilteredItemDelegate, наследующийся от QItemDelegate. При создании этого делегата передавать ему ссылку на виджет-перехватчик (QWidget *pFilter), который будет фильтровать события, а в методе createEditor() вызывать installEventFilter(pFilter) для создаваемого эдитора.
|
|
|
Текстовая версия | Сейчас: 25.4.2024, 22:54 |