Обработка MouseEvents в Qt c ++ - PullRequest
       30

Обработка MouseEvents в Qt c ++

4 голосов
/ 10 августа 2010

Извините за вопрос моего новичка ... Какой самый простой способ определить процедуры, которые выполняются, когда происходит MousePressEvent или MouseReleaseEvent?

Пока я определяю свой собственный класс (класс MyGraphicsView), который наследует QGraphicsView, и переопределяю события мыши (которые являются виртуальными функциями). Он работает нормально, но есть ли способ решить эту проблему без определения нового класса? Можно ли как-то связать события со слотами?

Спасибо за вашу помощь.

Ответы [ 5 ]

4 голосов
/ 10 августа 2010

Эта тема на форуме Qt Center довольно хорошо описывает ваши варианты.Проще говоря:

  1. Делайте то, что вы делаете (т.е. создайте подклассы и переопределите)

  2. Работайте с фильтром событий, как описано в теме и ссылкев нем

2 голосов
/ 10 августа 2010

Я не вижу проблем с переопределением QGraphicsView::mousePressEvent и QGraphisView::mouseReleaseEvent. Вся концепция обработки событий QGraphicsView / QGraphicsScene / QGraphicsItem построена на виртуальных функциях обработки событий.

Кроме того, также в документации Qt говорится, что «вы можете обеспечить свое собственное взаимодействие со сценой, создав подкласс QGraphicsView и переопределив обработчики событий мыши и ключа».

2 голосов
/ 10 августа 2010

Поскольку события мыши защищены виртуальными функциями, самый простой подход - это именно то, что вы делаете. Я не вижу причин, по которым определение подкласса могло бы вызвать проблемы, поэтому я говорю, придерживайтесь того, что у вас есть.

Если вы действительно хотите связать события со слотами, вы можете сделать реализацию своего подкласса mousePressEvent(), например, просто emit mousePressSignal(). Конечно, вам также необходимо объявить mousePressSignal() в разделе signals заголовка подкласса.

0 голосов
/ 10 августа 2010

Вы можете использовать фильтры событий: см. http://doc.qt.nokia.com/4.6/qobject.html#eventFilter Или, в частности, для графических элементов: http://doc.qt.nokia.com/4.6/qgraphicsitem.html#sceneEventFilter

Обратите внимание, что в последнем случае некоторые события изменяются: QMouseEvent становится, например, QGraphicsSceneMouseEvent, поэтому убедитесь, что для фильтра выбран правильный тип.

Что проще, зависит от ситуации. В любом случае, если у вас есть подкласс, переопределение виртуального метода часто более прямолинейно, чем подход фильтра событий. Но если вы хотите отслеживать несколько виджетов из нескольких разных классов и нуждаетесь в специальной обработке для определенного события, подклассы только для этой цели утомительны и не подходят для хорошего дизайна (и затрудняют, например, использование конструктора для этих виджетов).

0 голосов
/ 10 августа 2010

По вашему вопросу,

есть ли способ решить эту проблему без определения нового класса?

Ответ: Нет . Вы не можете .

Вы должны иметь наследование от класса, который вы хотите обработать события.

Могу ли я каким-либо образом связать события со слотами?

Нет . Вы не можете подключить события к слотам , но к слотам могут быть подключены только сигналы.

Способ, которым вы сейчас занимаетесь, - это способ сделать.

...