Событие Qt для делегата в таблице

Вопрос/проблема

Я попытался повторно реализовать метод event в пользовательском делегате для обработки кликов. Делегат используется для отображения ячеек таблицы в виде таблицы. Однако я не получаю никаких событий для делегата (метод никогда не вызывается в соответствии с отладчиком). Есть ли что-то особенное, что мне нужно сделать, чтобы мой делегат мог отслеживать события (в частности, вход/выход мыши, щелчки)?

Контекст

Я хотел бы создать собственное представление данных для ячеек таблицы. Функционал должен быть близок к кнопке, но немного отличаться. Я читал, что есть два варианта реализации кнопок в таблице: либо установка виджета ячейки, который предположительно имеет высокую стоимость производительности (я не совсем понял, почему), либо использование делегата.

Так как я хочу, чтобы поведение отличалось от поведения кнопки, и из-за мифа о скорости я решил использовать делегата.


person ted    schedule 07.05.2015    source источник
comment
Если вам нужно обрабатывать щелчки мыши, обрабатывайте сигналы/события объекта, на котором событие действительно произошло. Если ваш класс делегата предоставляет виджет для представления ячеек, обрабатывайте события на этих самых виджетах, а не в классе делегата.   -  person vahancho    schedule 07.05.2015
comment
@vahancho мой делегат просто рисует QPixmap с QPainter.drawPixmap, я думаю, нет ничего, что могло бы потреблять события. Вопрос в том, нужно ли мне как-то включать события для моего делегата, или есть какая-то причина, по которой делегат не должен получать события?   -  person ted    schedule 07.05.2015
comment
Если ваш делегат предназначен только для рисования, вы можете использовать сигнал QAbstractItemView::clicked() вашего табличного представления для обработки щелчков мыши по нему. Не нужно иметь дело с событиями вообще.   -  person vahancho    schedule 07.05.2015
comment
Я просто наследую QAbstractItemDelegate, и на самом деле я хотел бы обрабатывать события мыши вниз/вверх и мыши над/наведением мыши. Также, даже если выяснится, что есть методы buttonDown/up, mouseEnter/leave, я все равно хотел бы выяснить, почему моя функция event вообще не вызывается.   -  person ted    schedule 07.05.2015
comment
QAbstractItemDelegate это QObject. Он не может принимать и обрабатывать события графического интерфейса. Опять же - обрабатывайте события GUI в классах на основе QWidget, например, в вашем табличном представлении.   -  person vahancho    schedule 07.05.2015


Ответы (1)


События мыши отправляются в метод QAbstractItemDelegate::editorEvent(), даже если они не начинают редактирование элемента.

См.: http://doc.qt.io/qt-5/qabstractitemdelegate.html#editorEvent

person titusjan    schedule 07.05.2015