You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:04