初始化 QImages 的 QVector
Posted
技术标签:
【中文标题】初始化 QImages 的 QVector【英文标题】:Initializing QVector of QImages 【发布时间】:2016-05-15 23:33:31 【问题描述】:我对 Qt 还很陌生。这是我使用的第一个框架。我正在使用 Qt 编写二十一点游戏。在我看来,我应该将每张卡片的图像存储在容器类中,例如QVector
。容器类型为QImage
。所以我会有一个声明,例如QVector<QImage> cards;
也许这不是解决这个问题的最佳方法,所以当然欢迎任何替代建议。但是,无论如何,我想知道是否可以在声明期间初始化容器。我一直无法解决这个问题,所以我的解决方案如下:
// Deck.h
class Deck
public:
Deck();
void shuffle(); // Creates new deck and shuffles it.
QImage &popCard(); // Removes first card off deck.
private:
void emptyDeck(); // Empty the deck so new cards can be added
QVector<QImage> cards;
QQueue<QImage> deck;
;
// Deck.cpp
Deck::Deck()
cards.push_back(QImage(":/PlayingCards/Clubs 1.png"));
cards.push_back(QImage(":/PlayingCards/Clubs 2.png"));
cards.push_back(QImage(":/PlayingCards/Clubs 3.png"));
cards.push_back(QImage(":/PlayingCards/Clubs 4.png"));
// continue process for entire deck of cards...
这似乎非常乏味,特别是如果我考虑稍后添加不同风格的扑克牌,或者如果我让用户选择在运行时更改扑克牌的风格。对此有何有效设计?
【问题讨论】:
"如果可以在声明期间初始化容器" - 在 c++ 中,没有。 “这似乎非常乏味” - 是的,但是您将获得经验并且下一个项目(或者可能是这个项目)您会做得更好。根据 aspera ad astra。祝你好运! 【参考方案1】:我想知道是否可以在声明期间初始化容器
是的,你可以,因为 C++11:
QList<int> list1, 2, 3, 4, 5;
关于你的问题,一种方法可以是:
-
在资源中创建所有类型的图像样式调用类似模板,例如:“Name n.png”,其中 n -从 1 到 54 的数字(带有 Jokers 的卡片数量);
创建一些
QList<QImage>
(我认为它会比QVector更好);
创建一些 QMap 以便轻松搜索正确的模板;
为模板映射创建一些枚举类;
编写一个函数,通过选定的枚举更改卡片的图像。
但是,它是非常轻松的编码。我认为有更多有用的方法,还有很多其他更漂亮的方法来做这个游戏和逻辑。但作为你问题的一部分,这里有一些代码(可能不是很正确,因为按原样写):
// Somewhere in global
enum class CardsTemplate:
Clubs,
SomeTemp1,
SomeTemp2,
...
SomeTempN
.H 文件:
private:
QList<QImage> _images;
QMap<CardsTemplate, QString> _imagesMap
CardsTemplate::Clubs, QString("Clubs"),
CardsTemplate::SomeTemp1, QString("SomeTemp1"),
CardsTemplate::SomeTemp2, QString("SomeTemp2"),
...
CardsTemplate::SomeTempN, QString("SomeTempN")
public:
Deck(CardsTemplate temp);
void setNewTemplate(CardsTemplate temp);
.CPP 文件:
Deck::Deck(CardsTemplate temp)
for(int i = 1; i <= 54; i++)
_images << QImage(QString(":/Playing cards/%1 %2.png")
.arg(_imagesMap.value(temp)).arg(i));
void Deck::setNewTemplate(CardsTemplate temp)
for(int i = 1; i <= _images.size(); i++)
_images[i] = QImage(QString(":/Playing cards/%1 %2.png")
.arg(_imagesMap.value(temp)).arg(i));
【讨论】:
以上是关于初始化 QImages 的 QVector的主要内容,如果未能解决你的问题,请参考以下文章
初始化并访问 <QVector< QVector<int> > QT5
QT迭代器 QVector<int>::iterator it;