Как заставить реагировать на действия пользователя (click / hower / etc) только часть кнопки, основываясь на графической форме в Qt? - PullRequest
2 голосов
/ 13 января 2012

Вопрос немного сложно объяснить, но я постараюсь.

У меня есть изображение кнопки:

The base button image

И у меня также есть некоторые анимации этого, такие как (gif с одним циклом, перезагрузите его, чтобы просмотреть анимацию!):

Animated button

Также у меня есть какой-то шаблон:

The button pattern

Итак, теперь вопрос: как заставить кнопку реагировать (например, на нажатие / увеличение / и т. Д.) Только тогда, когда мышь находится ВНУТРИ черной части рисунка, и запрещать такие реакции, когда мышь находится вне области видимости этого шаблона? Без изменения графических файлов, конечно. И, конечно, сама модель должна быть невидимой.

Я хочу сделать это с помощью C ++ и Qt.

Просто, пожалуйста, укажите мне хотя бы путь, какие функции / классы Qt мне следует искать! Потому что теперь я полностью потерян.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Один из способов сделать это - установить фильтр событий для конкретной кнопки, вызвав метод void QObject::installEventFilter ( QObject * filterObj ) для кнопки.Документация может быть найдена здесь .

То, к чему она сводится, - это создание QObject специально для фильтрации событий мыши на основе двоичного изображения.Все, что вам нужно сделать, это переопределить метод bool QObject::eventFilter ( QObject * watched, QEvent * event ) этого нового объекта, а затем установить этот объект в качестве фильтра для кнопки.Как часть конструктора для этого класса фильтра, передайте ему ссылку на двоичное изображение.Эта двоичная ссылка на изображение будет использоваться в качестве переменной-члена в объекте фильтра, и мы можем использовать ее, чтобы решить, какие пиксели кнопки реагируют на события мыши.

В методе eventFilter:

  • Проверьте тип события, если это не событие мыши, не обрабатывайте событие самостоятельно, передайте его родительскому классу
  • Если это событие мыши , тогда вы в деле.
  • Получите положение мыши по x и y, используя соответствующие методы x() и y()
  • Просмотрите двоичное изображение, сохраненное как членпеременная.Если двоичное изображение true в этот момент, сделайте одно, в противном случае сделайте что-нибудь другое

Этот класс фильтра должен быть достаточно универсальным, чтобы можно было создать несколько его экземпляров с разными двоичными изображениями длякнопки / виджеты.

Надеюсь, это поможет.

2 голосов
/ 13 января 2012

Есть простой способ сделать это:

http://developer.qt.nokia.com/doc/qt-4.8/qwidget.html#setMask

Замаскированные виджеты получают события мыши только на видимых участках.

Это также замаскирует рисунок, поэтому вы можете попробовать альтернативный маршрут:

  1. Подкласс QPushButton,
  2. переписать mousePressEvent, чтобы обрезать маску,
  3. переписать paintEvent.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...