qtfor循环之妙用

Posted by 肥仔 on August 30, 2020

for循环之妙用

关卡图标的绘制

如下图所示图标,是如何绘制出来的呢?

代码理解

for循环的妙用,将图片按照一定的规律给递归分布,后将序列号写上。

1
2
3
4
for(int i = 0,i<20,i++){
    menuBtn ->move(25+(i%4)*70,130+(i/4)*70);
    label ->setText(QString::number(i+1));
}

完整详细代码见下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  //创建关卡按钮
    for(int i =0;i<20;i++){
        MyPushButton * menuBtn = new MyPushButton(":/res/LevelIcon.png");
        menuBtn ->setParent(this);
        menuBtn ->move(25+(i%4)*70,130+(i/4)*70);

        //按钮上显示的文字
        QLabel * label = new QLabel;
        label ->setParent(this);
        label ->setFixedSize(menuBtn->width(),menuBtn->height());
        label ->setText(QString::number(i+1));
        //设置居中
        label ->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        //移动
        label->move(25 + (i%4)*70 , 130+ (i/4)*70);
        //鼠标事件穿透
        label->setAttribute(Qt::WA_TransparentForMouseEvents,true);
        //监听选择关卡按钮的信号槽
        connect(menuBtn,&MyPushButton::clicked,[=](){
           if(pScene ==NULL){
               this ->hide();
               pScene = new PlayScene(i+1);
               pScene ->setGeometry(this->geometry());
               chooseSound->play();
               pScene ->show();

             //监听信号
            connect(pScene,&PlayScene::chooseSceneBack,[=](){
                this->setGeometry(pScene->geometry());
                  this->show();
                  backSound->play();
                  delete pScene;
                  pScene = NULL;
                              });
           }
        });

金币方格的绘制

如下图所示图标,是如何绘制出来的呢?

代码理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //创建金币的背景图片
      for(int i = 0 ; i < 4;i++)
      {
          for(int j = 0 ; j < 4; j++)
          {
             //绘制背景图片
              QPixmap  pix = QPixmap(":/res/BoardNode.png");
              QLabel* label = new QLabel;
              label->setGeometry(0,0,pix.width(),pix.height());
              label->setPixmap(pix);
              label->setParent(this);
              label->move(57 + i*50,200+j*50);
          }
      }

总结

以为两个小例子分别用for 循环完成了多场景的创建,值得借鉴。