在 Qt 中使用  qDebug()  实现表格化输出,核心是通过格式化字符串对齐列数据,以下是直接可用的实现方案,包含基础固定列宽、自适应列宽两种实用模板。
 
1. 基础固定列宽表格(直接复制使用)
 
适用于字段长度固定的场景,利用  %*s  控制字符串宽度, \t  辅助对齐。
 
cpp   
#include <QDebug>
#include <QString>

void printFixedTable() {
    // 1. 打印表头(设置列宽,例如 15/10/12 字符宽度)
    qDebug().noquote() << QString("%-15s %-10s %-12s")
                           .arg("姓名", -15)
                           .arg("年龄", -10)
                           .arg("部门", -12);
    qDebug().noquote() << "------------------------------------------";

    // 2. 打印数据行
    qDebug().noquote() << QString("%-15s %-10d %-12s")
                           .arg("张三", -15)
                           .arg(28, -10)
                           .arg("研发部", -12);
    qDebug().noquote() << QString("%-15s %-10d %-12s")
                           .arg("李四", -15)
                           .arg(32, -10)
                           .arg("市场部", -12);
}

// 调用示例
// printFixedTable();
 
 
关键说明
 
-  %-15s :左对齐,占用 15 字符宽度; %15s  为右对齐。
-  .noquote() :避免 qDebug 自动添加双引号。
- 数值类型用  %d / %f ,字符串用  %s ,需与  arg()  参数类型匹配。
 
2. 自适应列宽表格(适配动态数据)
 
适用于字段长度不固定的场景,先计算每列最大宽度,再统一格式化输出。
 
cpp   
#include <QDebug>
#include <QString>
#include <QList>
#include <algorithm>

// 定义数据结构
struct Employee {
    QString name;
    int age;
    QString dept;
};

void printAutoFitTable() {
    QList<Employee> empList = {
        {"张三", 28, "研发部"},
        {"李四", 32, "市场部"},
        {"王老五", 45, "产品运营中心"} // 长字段测试
    };

    // 1. 计算每列最大宽度(包含表头)
    int nameWidth = QString("姓名").size();
    int ageWidth = QString("年龄").size();
    int deptWidth = QString("部门").size();

    for (const auto& emp : empList) {
        nameWidth = qMax(nameWidth, emp.name.size());
        ageWidth = qMax(ageWidth, QString::number(emp.age).size());
        deptWidth = qMax(deptWidth, emp.dept.size());
    }
    // 增加 2 个字符间距,优化显示
    nameWidth += 2;
    ageWidth += 2;
    deptWidth += 2;

    // 2. 构造格式化字符串
    QString headerFmt = QString("%%1s %%2s %%3s")
                            .arg(-nameWidth)
                            .arg(-ageWidth)
                            .arg(-deptWidth);
    QString dataFmt = QString("%%1s %%2d %%3s")
                           .arg(-nameWidth)
                           .arg(-ageWidth)
                           .arg(-deptWidth);

    // 3. 打印表格
    qDebug().noquote() << headerFmt.arg("姓名").arg("年龄").arg("部门");
    qDebug().noquote() << QString(nameWidth + ageWidth + deptWidth, '-');
    for (const auto& emp : empList) {
        qDebug().noquote() << dataFmt.arg(emp.name).arg(emp.age).arg(emp.dept);
    }
}

// 调用示例
// printAutoFitTable();
 
 
3. 注意事项
 
1. 若输出中文出现对齐错乱,确保代码文件编码为 UTF-8 with BOM(Qt Creator 默认)。
2. 控制台字体需为等宽字体(如 Consolas),否则宽度计算失效。
3. 若需输出到文件,可结合  QFile  和  QTextStream ,格式化逻辑完全复用。

如果这篇文章对你有帮助,别忘了点个关注,我会持续分享更多开发避坑与实战干货,下次更新你就能第一时间看到啦~

 

更多推荐