如何遍历QGridLayout控件并按网格位置排序填充15*15 QString数组
核心解决思路
QGridLayout 本身已经存储了所有子控件的网格位置信息,不需要为控件额外添加自定义属性,也不需要硬编码,直接调用布局自带的接口即可获取每个控件对应的行、列索引。
方案1:遍历布局项直接获取位置(优先推荐)
不需要依赖控件命名规则,兼容性最强,实现代码如下:
// 可选:先初始化board数组,避免脏数据 for (int r = 0; r < 15; r++) { for (int c = 0; c < 15; c++) { board[r][c] = ""; } } // 遍历网格布局所有子项 int layoutItemCount = ui->gridLayout->count(); for (int i = 0; i < layoutItemCount; i++) { QLayoutItem* item = ui->gridLayout->itemAt(i); // 筛选QTextEdit类型控件 QTextEdit* edit = qobject_cast<QTextEdit*>(item->widget()); if (!edit) continue; int row = -1, col = -1, rowSpan = -1, colSpan = -1; // 调用布局接口获取当前项的行列信息 ui->gridLayout->getItemPosition(i, &row, &col, &rowSpan, &colSpan); // 校验行列范围合法性后赋值 if (row >=0 && row <15 && col >=0 && col <15) { board[row][col] = edit->toPlainText(); } }
方案2:解析控件objectName获取位置
如果你确定所有QTextEdit的命名都遵循box行号x列号的规则(和你硬编码时的命名一致),也可以通过解析控件名获取位置,代码如下:
QList<QTextEdit*> textEdits = ui->gridLayout->findChildren<QTextEdit *>(); for (QTextEdit* box : textEdits) { QString objName = box->objectName(); // 拆分名称提取行列号 objName.remove("box"); QStringList pos = objName.split("x"); if (pos.size() != 2) continue; int row = pos[0].toInt(); int col = pos[1].toInt(); if (row >=0 && row <15 && col >=0 && col <15) { board[row][col] = box->toPlainText(); } }
内容的提问来源于stack exchange,提问作者GreenDev3
相关产品推荐
相关产品推荐

