Вызов setPos () для пользовательского QGraphicsPixmapItem не обновляет QGraphicsScene немедленно - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю над небольшой игрой в покер, и у меня есть графическая ошибка, которую я хотел бы лучше понять и исправить. Для своего класса «Card» я разделил элементы QGraphicsPixmap на подклассы и добавил «колоду» из 52 карт в свою QGraphicsScene.

Во время выполнения я нажимаю кнопку, чтобы сдать карты, которые затем вызывают setPos () для первого три для симуляции флопа.

Проблема в том, что карты, кажется, не сразу вытягивают себя полностью (см. фото). Когда я изменяю размер окна, они внезапно открываются. QGraphicsView не обновляется при изменении положения карты.

Я протестировал вызов setPos () для моего фонового изображения, которое является обычным элементом QGraphicsPixmap, и оно перемещается правильно и сразу же обновляет весь QGraphicsScene, поэтому я думаю, это должна быть какая-то ошибка, которую я допустил при создании своего класса "Card", но я не уверен, что делаю неправильно.

РЕДАКТИРОВАТЬ: Я до сих пор не знаю точно знаю, что происходит, но вот еще одна подсказка, если это кому-нибудь поможет.

Когда я создаю карту и устанавливаю ее для перемещения вправо на 100 пикселей и вниз на 100 пикселей при нажатии кнопки, немного изображения исчезает с каждым кликом, пока не исчезнет полностью. Но если я изменю размер своего окна в любое время, изображение карты снова откроется в полном представлении, в правильном обновленном положении. Либо QGraphicsView или QGraphicsScene не регистрирует изменения в позициях моей карты?

Вызов «m_pokerscene.update ()» (m_pokerScene - это мой QGraphicsView) каждый раз, когда я меняю положение элемента карты, является грубым исправлением, заключающимся в том, что работает, но громоздко, должно быть ненужным и просто скрывает мою настоящую проблему.

Есть мысли? Я ценю это!

pokerTable. cpp (соответствующая часть)

void PokerTable::dealFlop()
{
    m_deck->burnCard();

    m_flopCard1 = m_deck->dealCard(); // dealCard() returns a pointer to a Card, stored in these data members
    m_flopCard2 = m_deck->dealCard();
    m_flopCard3 = m_deck->dealCard();

    m_flopCard1->setPos(m_flopCard1Position); //QPointF positions
    m_flopCard2->setPos(m_flopCard2Position);
    m_flopCard3->setPos(m_flopCard3Position);
}

Card.h

#ifndef CARD_H
#define CARD_H

#include <QGraphicsPixmapItem>
#include <QLabel>

class Card : public QGraphicsPixmapItem
{
public:
    enum class Rank
    {
        TWO,
        THREE,
        FOUR,
        FIVE,
        SIX,
        SEVEN,
        EIGHT,
        NINE,
        TEN,
        JACK,
        QUEEN,
        KING,
        ACE,
        MAX_RANKS
    };

    enum class Suit
    {
        CLUBS,
        DIAMONDS,
        HEARTS,
        SPADES,
        MAX_SUITS
    };

    Card();

    Card(const Card &card2);

    Card& operator=(const Card &card);

    int getCardValue();

    void setRank(int rank);

    void setSuit(int suit);

    void setTexture(QPixmap texture);

    void setSprite();

    void printCard();

protected:
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;

    virtual QRectF boundingRect() const override;

private:
    QPixmap m_texture;
    QPointF m_sprite;

    Rank m_rank;
    Suit m_suit;
};

#endif // CARD_H

Карта. cpp (соответствующая часть)

#include "Card.h"
#include <QPainter>
#include <iostream>

Card::Card()
    : m_sprite{ QPointF(0, 0) }
{
    setScale(0.2);
    setFlag(ItemSendsGeometryChanges, true);
}

Card::Card(const Card &card2)
{
    m_texture = card2.m_texture;
    m_sprite = card2.m_sprite;

    m_rank = card2.m_rank;
    m_suit = card2.m_suit;
}

Card& Card::operator=(const Card &card)
{
    m_texture = card.m_texture;
    m_sprite = card.m_sprite;

    m_rank = card.m_rank;
    m_suit = card.m_suit;

    return *this;
}

void Card::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawPixmap(x(), y(), m_texture, m_sprite.x(), m_sprite.y(), 560, 780);
}

QRectF Card::boundingRect() const
{
    return QRectF(0, 0, 560, 780);
}

Как это выглядит сразу после вызова setPos на картах (НЕПРАВИЛЬНО)

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

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