QGraphicsPixmapItem - инициировать только событие верхнего объекта - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь сделать карточную игру. У игрока есть вектор карт и (рука), которая представлена ​​в графическом интерфейсе.

Example how it looks

Мои карты наследуются от QGraphicsPixmapItem и QObject. Чего я хочу добиться, так это установить MouseEvent на карту и вызвать это событие только для одной карты. Теперь возникает проблема, если я нажимаю на Карту, возникают ситуации, когда они находятся близко (как на картинке), и происходит событие на нескольких картах.

Как я могу предотвратить такое поведение моих Карт?

Вот мой Card.cpp (с методом sceneEvent)

#include "Card.h"
#include "Game.h"
#include <string>
#include <QDebug>
#include <QPixmap>
#include <QSize>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QEvent>

extern Game * game;

Card::Card(QString pixmapURL, std::string rank, std::string suit, int value)
{
    this->pixmapURL = pixmapURL;
    this->rank = rank;
    this->suit = suit;
    this->value = value;

    setPixmap(QPixmap(this->pixmapURL));
    setScale(0.10);
}

int Card::getValue()
{
    return this->value;
}

std::string Card::getSuit()
{
    return this->suit;
}

std::string Card::getRank()
{
    return this->rank;
}

void Card::display()
{
    qDebug() << this->suit.c_str() << this->rank.c_str();
}

bool Card::sceneEvent(QEvent *event)
{
    if (event->type() == QEvent::GraphicsSceneMousePress) {
        //qDebug() << event->MouseButtonPress;
        setPos(game->scene->width()/2, game->scene->height()/2);
    }
    return QGraphicsItem::sceneEvent(event);
}

1 Ответ

0 голосов
/ 30 октября 2019

Вам необходимо принять событие для этого объекта.

С QEvent документация:

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

bool Card::sceneEvent(QEvent *event)
{
    if (event->type() == QEvent::GraphicsSceneMousePress) {
        //qDebug() << event->MouseButtonPress;
        event->setAccepted(true); // this will prevent the event from being propagated to underlaying objects
        setPos(game->scene->width()/2, game->scene->height()/2);
    }
    return QGraphicsItem::sceneEvent(event);
}
...