2015-03-31 4 views
2

У меня возникла проблема с mousePressEvent(QGraphicsSceneMouseEvent *event), действительно, площадь, на которую можно щелкнуть, кажется маленькой и находится в центре от QGraphicsPixmapItem, к которому она привязана.Qt "mousePressEvent" изменить зону смены

http://i.stack.imgur.com/znpgW.png

красная линия, где QGraphicsPixmapItem кликабельна.

Как бы я сосредоточил его и в конечном итоге сделать его больше и изменить его форму?

Вот части моего кода, которые могут быть полезны:

В player.h

class Player:public QObject, public QGraphicsPixmapItem{ 
    Q_OBJECT 
public: 
    Player(); 
    void place_player(int x, int y); 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

В player.cpp

Player::Player(): QGraphicsPixmapItem(){ 
} 

void Player::place_player(int x,int y) 
{ 
    this->setPixmap(QPixmap("test.png")); 
    this->setPos(x,y); 
    game->scene->addItem(this); 
} 

void Player::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    qDebug()<< event; 
}; 

в game.cpp

Game::Game(){ 

    setFixedSize(1600,900); 

    scene = new QGraphicsScene(this); 
    scene->setSceneRect(0,0,1600,900); 

    setScene(scene); 
} 

void Game::start(){ 
    player1 = new Player(); 
    player1->place_player(300,300); 
} 

void Game::mousePressEvent(QMouseEvent *event) 
{ 
    QGraphicsView::mousePressEvent(event); 
} 

И, наконец, main.cpp

int main(int argc, char *argv[]){ 

    QApplication a(argc, argv); 

    game = new Game(); 

    game->show(); 
    game->start(); 

    return a.exec(); 
} 

Большое спасибо за вашу помощь

ответ

1

щелчки площадь 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.

+1

Большое вам спасибо :) –

Смежные вопросы