crossplatform.ru

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


  Ответ в Перехват нажатий клавиш в QTableWidget
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Denis.Rassvetniy Дата 19.11.2011, 22:17
  Как вариант можно создать делегат, например FilteredItemDelegate, наследующийся от QItemDelegate. При создании этого делегата передавать ему ссылку на виджет-перехватчик (QWidget *pFilter), который будет фильтровать события, а в методе createEditor() вызывать installEventFilter(pFilter) для создаваемого эдитора.
alzasr Дата 19.10.2011, 13:06
  У QTableWidget есть массив cellWidget, который содержит созданные виджеты ячеек. Им можно назначать eventFilter. Вопрос решен.
alzasr Дата 18.10.2011, 7:49
  Из того что нашел в исходниках. Экземпляр виджета редактирования создается в методе 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 Дата 17.10.2011, 15:29
  Почитав маны нашел, что при редактировании делегатом создается виджет, который и отображается. Как вариант можно создать свой делегат со своим виджетом, который и будет сигнализировать о событии нажатия клавиши. Но мне кажется есть другой способ, более элегантный. У делегата есть метод создающий виджет и возвращающий ссылку на него QWidget *createEditor. У виджета есть installEventFilter. Нужно наследоваться от QTableWidget и переопределить метод, вызывающий createEditor у делегата и назначать созданному виджету фильтр событий. Вопрос теперь такой: какой метод надо переопределять? Если кто-нибудь знает, ответьте, я пока буду исходники читать.
alzasr Дата 17.10.2011, 14:25
  Мне нужно перехватывать все нажатия клавиш в QTableWidget и после анализа либо что-то сделать (в основном изменить фокус ввода) либо передать событие дальше на обработку.
Погуглив нашел 2 варианта.
1. Насловаться от QTableWidget, переопределить keyPressEvent
2. использовать eventFilter

Опробовал оба способа, но не все клавиши перехватываются. При редактировании ячейки не реагирует на нажатие стрелок влево-вправо, а вверх-вниз все норм. Я так понимаю, что какой-то виджет, отвечающий за ячейку, перехватывает события и если события ей подходят, то прерывают цепочку. У QTableWidgetItem нет installEventFilter и keyPressEvent, как я понял по исходникам это не QWidget. Подскажите, где копать или где я неправ.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 5.5.2024, 21:47