LINUX.ORG.RU

Нужно ли пробрасывать mouseMoveEvent в QTableView?

 , , обработчик,


0

1

Возник такой теоретический вопрос: если в классе, унаследованном от QTableView, имеется своя реализация mouseMoveEvent, то нужно ли в моменты, когда собственной обработки внутри переопределенного mouseMoveEvent не предусмотрено, вызывать родительский mouseMoveEvent?

void MyView::mouseMoveEvent(QMouseEvent *event)
{
  ...
  QTableView::mouseMoveEvent(event);
}

Можно ли вообще не делать вызова родительского mouseMoveEvent? На что отсутствие вызова родительского mouseMoveEvent может повлиять?

На первый взгляд действительно, родительский обработчик mouseMoveEvent можно вообще не вызывать. Но может быть, есть какие-то неочевидные ситуации? Например, если не вызывать, то перестанет правильно работать драг-анд-дроп в режиме мультивыбора, или там перестанет выделяться строка при настройке QAbstractItemView::SelectRows после клика мышки на незаполненной строками области таблицы, или еще какая-нибудь замудренная хрэнь?

★★★★★

Я бы вызывал во всех случаях, которые не покрываются твоим обработчиком. Потому что мало ли чем это (отсутствие вызова, в смысле) обернётся

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)
Ответ на: комментарий от XMs

+1 Сделал бы так же.

Скорее всего пробрасывать нужно только если базовый класс переопределяет этот метод.

anonymous-angler ★☆
()
Ответ на: комментарий от XMs

Ну вот я обнаружил такую дичь, что в глубинах QTableView::mouseMoveEvent() может вызываться setSelection() и соответственно генерироваться selectionChanged(), причем в передаваемых QIndex будут ячейки не те, с которыми работает пользователь, а соседние.

Происходит это раз в 15-20 попыток работы со строкой таблицы, если нагрузить проц какой-нибудь задачей, и быстро двигать мышкой.

https://i.imgur.com/fA3NCma.png

Поэтому я и думаю: а нафига вообще вызывать QTableView::mouseMoveEvent()? Тем более, что в примерах драг-анд-дропа в переопределенном mouseMoveEvent() нет вызова родительского обработчика mouseMoveEvent(): https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/draganddrop/dragg....

Наверно, это не просто так?

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Мне кажется, стоит спросить в qt-user, в каких случаях оно вызывается и почему. Наверняка есть какая-то причина.


что в примерах драг-анд-дропа в переопределенном mouseMoveEvent() нет вызова родительского обработчика mouseMoveEvent()

Я, наверное, слепой, но я не вижу там mouseMoveEvent(), только mousePressEvent()

XMs ★★★★★
()
Ответ на: комментарий от Xintrea

причем в передаваемых QIndex будут ячейки не те, с которыми работает пользователь, а соседние.

Происходит это раз в 15-20 попыток работы со строкой таблицы, если нагрузить проц какой-нибудь задачей, и быстро двигать мышкой

QEvent асинхронный, и в отличие от обычных вызовов функций он медленнее примерно в 100 раз. Если ты где-то смешиваешь функции с qevent или вообще делаешь qtimer singleshot с лямбдой это приводит с разным страшным глюкам.

anonymous
()
Ответ на: комментарий от XMs

Я это по аналогии показал. Внутри mousePressEvent нет родительского mousePressEvent.

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.