初始化 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&lt;QImage&gt;(我认为它会比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

Qt6-QVector分析

QVector 与 'operator=' 不匹配

QT迭代器 QVector<int>::iterator it;

急急急急!!!求救!!!初始化tablewidget表格信息并生成垂直表头和水平表头

在QML :: Image视图上更新多个QImages仅显示最后发送的QImages