Я работаю над небольшой игрой в покер, и у меня есть графическая ошибка, которую я хотел бы лучше понять и исправить. Для своего класса «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 на картах (НЕПРАВИЛЬНО)

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