【问题标题】:Generating items in Qt C++在 Qt C++ 中生成项目
【发布时间】:2015-05-07 09:46:40
【问题描述】:

我有一个用于生成 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);
    }
}

【问题讨论】:

  • jwidth - 1 时,您正在添加一张尚未设置位置的卡片。
  • 我怀疑您的意思是在外部循环标头中使用 height 而不是 width
  • @molbdnilo 我在里面添加了continue;,但问题仍然存在。
  • @Wintermute width 变量是板的宽度,并且始终是宽度*宽度。所以没有高度。
  • @user3710031 也许您可以添加一个您期望场景看起来像什么的描述?我怀疑x = 0 - card_width 会让你把卡片放在窗外。

标签: c++ qt scene


【解决方案1】:

只是为了完成 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), next 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 (card 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 (card 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 --> ...

结果:

【讨论】:

  • 哇,很好的解释!我一定会更多地使用我的钢笔和铅笔:)
【解决方案2】:

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

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 都取出来作为循环并使它们成为常数值。

【讨论】:

  • 这非常有效。你是对的,但是卡片的尺寸可以改变,我认为让尺寸成为 Card 类的成员是一种很好的做法。
  • @user3710031,这确实是个好主意。在卡片设计期间,尺寸会动态变化(在运行时),还是您稍后会更改?
  • @vanacho 我在开发过程中定义它们,那时我可能会更改图像尺寸,因此它们是硬编码的。没有运行时更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2018-12-23
  • 2012-10-04
相关资源
最近更新 更多