【问题标题】:Initializing QVector of QImages初始化 QImages 的 QVector
【发布时间】:2023-03-20 02:40:01
【问题描述】:

我对 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。祝你好运!

标签: qt initialization qimage qvector


【解决方案1】:

我想知道是否可以在声明期间初始化容器

是的,你可以,因为 C++11

QList<int> list{1, 2, 3, 4, 5};

关于你的问题,一种方法可以是:

  1. 在资源中创建所有类型的图像样式调用类似模板,例如:“Name n.png”,其中 n -从 1 到 54 的数字(带有 Jokers 的卡片数量);
  2. 创建一些QList&lt;QImage&gt;(我认为它会比QVector更好);
  3. 创建一些 QMap 以便轻松搜索正确的模板;
  4. 为模板映射创建一些枚举类;
  5. 编写一个函数,通过选定的枚举更改卡片的图像。

但是,它是非常轻松的编码。我认为有更多有用的方法,还有很多其他更漂亮的方法来做这个游戏和逻辑。但作为你问题的一部分,这里有一些代码(可能不是很正确,因为按原样写):

// 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));
}

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多