crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Перехват нажатий клавиш в 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 вот в этом куске
QWidget *editor = d->editor(index, options);
    if (editor) {
        editor->show();
        d->persistent.insert(editor);
    }

и сохраняется в 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) для создаваемого эдитора.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 22:54