щелчки площадь QGraphicsItem определяется его boundingRect и shape функций.
Я бы начал с использования QGraphicsPixmapItem. Вам нужен пользовательский графический элемент, который имеет функциональность сигналов и слотов, поэтому выведите QGraphicsObject.
class Player : public QGraphicsObject
{
};
Как мы теперь получили этот класс, нам необходимо переопределить пару чистых виртуальных функций; а именно boundingRect, paint
class Player : public QGraphicsObject
{
public:
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
};
Функция boundingRect определяет объект в локальных координатах. Например, предположим, что символ будет иметь ширину и высоту 100. Если мы установим boundingRect для возврата (0, 0, 100, 100), это будет ориентировано в верхнем левом углу. Вместо этого мы хотим, чтобы центр ограничивающего прямоугольника на нашем проигрывателе:
QRectF Player::boundingRect() const
{
return QRectF(-50, -50, 100, 100); // local coordinates, centered on the Player
}
Чтобы сделать наш плеер, хранить QPixmap в классе
class Player : public QGraphicsObject
{
public:
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
private:
QPixmap m_playerPixmap;
};
Я предполагаю, что вы знаете, как загрузить растровое изображение и может сделать это в конструкторе игрока.
Все, что нам нужно сейчас, чтобы сделать игрок, и мы также покажем активную область, которая определяется функцией boundingRect(): -
void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
// draw the player
painter->drawPixmap(0, 0, m_playerPixmap);
// set the pen to draw debug rect
painter->setPen(QColor(255, 0, 0, 127));
// for debug purposes, show the bounding rect (clickable area)
painter->drawRect(boundingRect());
}
Первоначально я говорил о том, что активная область определяются с помощью функций boundingRect и shape. Поскольку Игрок имеет одинаковую форму (прямоугольник), мы заботимся только об ограничительном реке. В случае неправильной формы вы также переопределите функцию фигуры.
Как бы я сосредоточил его и в конечном итоге сделать его более крупным и изменить его форму?
Надеюсь, теперь вы знаете, что для увеличения размера игрока это просто вопрос увеличения его локальных координат, возвращаемых функцией boundingRect. Таким образом, если мы хотим, чтобы удвоить свою ширину и высоту, мы бы это сделать:
QRectF Player::boundingRect() const
{
return QRectF(-100, -100, 200, 200); // local coordinates, centered on the Player
}
Чтобы изменить свою форму, реализовать функцию формы() и отлаживать, покрасить painterPath вернулся из этой функции, а рисование boundingRect.
Например, давайте получим круглую зону с кликами.
Предполагая, что вы добавили декларацию формы к заголовку игрока:
QPainterPath Player::shape() const
{
QPainterPath path;
path.addEllipse(-100, -100, 200, 200);
return path;
}
void Player::paint(QPainter * painter, const QStyleOptionGraphicsItem, QWidget*)
{
// draw the player
painter->drawPixmap(0, 0, m_playerPixmap);
// set the pen to draw debug path
painter->setPen(QColor(255, 0, 0, 127));
// for debug purposes, show the path (clickable area)
painter->drawPath(shape());
}
Последним, что следует отметить, что если вы отменяя функцию формы, вы все равно должны реализовать boundingRect.
Большое вам спасибо :) –