Эффективный способ сделать массив меток

Я делаю настольную игру, и мне нужно отобразить массив 15 х 15 в моем графическом интерфейсе. Я решил пойти с отдельными метками, которые содержат один элемент массива. Это значит, что у меня довольно много ярлыков. Я дал каждому ярлыку имя "tile_0_0", где первый 0 - это строка, а второй 0 - это столбец. Это было довольно легко сделать в Qt.

Проблема, однако, в том, что я, конечно, не могу просто использовать 2 forloops для доступа к каждой плитке, так как вы не можете использовать переменные в именах. ("tile_i_j" не существует.) Чтобы решить эту проблему, я решил создать массив, который содержит каждую метку. Однако я не могу инициализировать эффективный массив из-за упомянутой ранее проблемы.

Вопрос в том, как избежать написания гигантского блока кода. Небольшой фрагмент текущего кода:

    Ui::BoardView *ui = new UI::BoardView; // BoardView is my class
    QLabel* m_boardLbArray[8][8];
    m_boardLbArray[0][0] = ui->tile_0_0;
    m_boardLbArray[0][1] = ui->tile_0_1;
    m_boardLbArray[0][2] = ui->tile_0_2;
    m_boardLbArray[0][3] = ui->tile_0_3;
    m_boardLbArray[0][4] = ui->tile_0_4;
    // ...

Примечание. Извините, что я не опубликовал часть кода, которую вы могли бы просто скопировать и запустить, но я не знаю, как это связано с графическим интерфейсом.

1 ответ

Решение

Похоже, вы создаете свои плитки (QLabels) в Qt Designer; Более чистый способ добиться этого - создавать их программно. Вы можете сделать что-то вроде добавления Grid Layout к вашей форме в Designer в нужном вам месте, а затем сделать:

QGridLayout *layout = ui->gridlayout;
QLabel* m_boardLbArray[8][8];
for(int row=0; row<8; row++)
  for(int col=0; col<8; col++)
  {
    m_boardLbArray[row][col] = new QLabel(this);
    m_boardLbArray[row][col]->setText(tr("This is row %1, col %2")
      .arg(row).arg(col));
    layout->addWidget(m_boardLbArray[row][col], row, col);
  }
Другие вопросы по тегам