Эффективный способ сделать массив меток
Я делаю настольную игру, и мне нужно отобразить массив 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);
}