Qt 设置QTableView表格列宽自动均分表格
Qt 设置QTableView表格列宽自动均分表格
前言
最近项目需要对数据库里的表进行一个自适应的显示,在显示到QTableView上时,发现表格的宽度会有点不太好看,所以就决定自动的调整表格的宽度。
setSectionResizeMode
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 平分
这里也可以设置表格的宽度自动适应,但是这个比较僵硬,这个不会管表头的内容,只会去适应表格里面的内容,但是当表格里面的内容宽度小于表头的宽度时,就会把表头压缩到看不清楚,诚然你可以设置最小宽度,但是这样总归还是不太合适,设置最小宽度的方法在这里
tableView = createView(mySqlQueryModel, QObject::tr("可颂坊报表系统"));
//tableView->resizeColumnsToContents();
// 设置表格调整模式为适应表格内容
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 设置最小的宽度
tableView->horizontalHeader()->setMinimumSectionSize(100);
通过获取字体占的像素来设置
可以通过计算字体所占的像素来设置对应的宽度,使用的类是QFontMe
QFont font;
// fontFamily 是字体
font.setFamily(fontFamily);
// fontPixel 是大小
font.setPixelSize(fontPixel);
QFontMetrics fontMetrics(font);
result = fontMetrics.boundingRect(text).width();
然后需要根据表格列的内容最大的宽度、平均分表格的宽度和表格表头文字所占的宽度来设置表格的列的宽度
// 表格列的宽度为 max (表格头的文字占的像素, 均分表格的长度, 表格中每一列中的文字最大值)
int tableWidth = ui->tableView->width() - 15;
// 排除第一列的复选框,所以需要减去100,且表格列数需要减一
int columnAverageWidth = (tableWidth - 100) / (m_itemModel->columnCount() - 1);
ui->tableView->setColumnWidth(0, 100);
for (int i = 1; i < m_itemModel->columnCount(); i++) {
// textPixel 为上面的计算字体所占像素的函数
int headerWordWidth = textPixel("Microsoft YaHei",
16,
m_itemModel->headerData(i, Qt::Horizontal)
.toString());
// QVector<int> m_columnTextMaxWidth; 记录了每一列中的文字的最宽所占的像素。
int columnWidth = qMax(m_columnTextMaxWidth.at(i)+10,
qMax(columnAverageWidth, headerWordWidth + 10));
ui->tableView->setColumnWidth(i, columnWidth);
}
这样的话,就可以根据找出最合适的宽度了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义