在 Qt C++ 中生成项目

Generating items in Qt C++

我有一个用于生成卡片项目到 Qt 场景的代码。到目前为止,这是我想出的。调用的成员函数就是你从名称中派生出来的,所以我不需要在这里包括它们。

// creating the cards
int x = 0;
int y = 0;
int line_brake = 0;
for(int i = 0; i < width; i++)
{
    for(int j = 0; j < width; j++)
    {
        card = new Card();
        int card_width = card->getWidth();
        int card_height = card->getHeight();
        if(j == (width-1))
        {
            line_brake = 1;
        }
        else if((j != (width-1)) && (line_brake == 1))
        {
            y += card_height;
            card->setPos(x,y);
            line_brake = 0;
            x = 0 - card_width;
        }
        else
        {
            card->setPos(x,y);
            x += card_width;
        }
        scene->addItem(card);
    }
}

这是我的场景在这段代码运行后的样子:

可能是什么问题?我需要将卡片放置在 7*7 的正方形中。这意味着 7 行 7 列,每个字段中都有一张卡片图像。


这是我的场景在@molbdnilo 的编辑建议后的样子:

// creating the cards
int x = 0;
int y = 0;
int line_brake = 0;
for(int i = 0; i < width; i++)
{
    for(int j = 0; j < width; j++)
    {
        card = new Card();
        int card_width = card->getWidth();
        int card_height = card->getHeight();
        if(j == (width-1))
        {
            line_brake = 1;
            continue;
        }
        else if((j != (width-1)) && (line_brake == 1))
        {
            y += card_height;
            card->setPos(x,y);
            line_brake = 0;
            x = 0;
        }
        else
        {
            card->setPos(x,y);
            x += card_width;
        }
        scene->addItem(card);
    }
}

老实说,我不知道这段代码为什么会出问题。我也不知道为什么要写这么复杂。要生成卡片,我会执行以下操作:

const int size = 7;
for(int row = 0; row < size; row++)
{
    for(int col = 0; col < size; col++)
    {
        Card *card = new Card;
        int card_width = card->getWidth();
        int card_height = card->getHeight();
        int x = col * card_width;
        int y = row * card_height;
        card->setPos(x, y);
        scene->addItem(card);
    }
}

甚至更多。根据图片,看起来所有的卡片都具有相同的尺寸,所以我将 card_widthcard_height 都用于循环并使它们成为常量值。

只是为了完成 vahancho 给你的答案。当你遇到这样的问题时,只需拿起笔和纸,一步一步地写下你的变量值。很简单,一看就知道是什么问题了。


开始于:

  • x = 0
  • y = 0
  • line_brake = 0
  • 宽度=7
  • 考虑卡片的宽度和高度 = 1

开始循环:

  • i = 0, j = 0 --> 进入第三个条件,card->setPos(0,0), next x=1 (card A)
  • i = 0, j = 1 --> 进入第三个条件,card->setPos(1,0), next x=2 (card B)
  • i = 0, j = 2 --> 进入第三个条件,card->setPos(2,0), next x=3 (card C)
  • i = 0, j = 3 --> 进入第三个条件,card->setPos(3,0),下一个 x=4 (card D)
  • i = 0, j = 4 --> 进入第三个条件,card->setPos(4,0), next x=5 (card E)
  • i = 0, j = 5 --> 进入第三个条件,card->setPos(5,0), next x=6 (card F)
  • i = 0, j = 6 --> 进入第一种情况,没有 setPos(),请参阅卡片构造函数中的默认 x、y 值?,卡片可能在 0,0 中添加,line_break=1 (卡G)

  • i = 1, j = 0 --> 进入第二种情况,y=1, card->setPos(6, 1), line_break=0, next x= -1 (卡片H)

  • i = 1, j = 1 --> 进入第三个条件,card->setPos(-1, 1), next x=0 (card I)
  • i = 1, j = 2 --> 进入第三个条件,card->setPos(0, 1), next x=1 (card J)
  • i = 1, j = 3 --> 进入第三个条件,card->setPos(1, 1), next x=2 (card K)
  • i = 1, j = 4 --> 进入第三个条件,card->setPos(2, 1), next x=3 (card L)
  • i = 1, j = 5 --> 进入第三个条件,card->setPos(3, 1), next x=4 (card M)
  • i = 1, j = 6 --> 进入第一种情况,没有 setPos(),请参阅卡片构造函数中的默认 x、y 值?,卡片可能在 0,0 中添加,line_break=1 (卡片N)

  • i = 2, j = 0 --> 进入第二种情况,y=2, card->setPos(4, 2), line_break=0, next x= -1 (卡片O)

  • i = 2, j = 1 --> 进入第三个条件,card->setPos(-1, 2), next x=0 (card P)
  • i = 2, j = 2 --> 进入第三个条件,card->setPos(0, 2), next x=0 (card Q)
  • i = 2, j = 3 --> ...
  • i = 2, j = 4 --> ...

作为结果: