Qt 设置QTableView表格列宽自动均分表格

本文介绍了如何在Qt中设置QTableView表格列宽自动均分,以达到美观显示的效果。通过使用QHeaderView的setSectionResizeMode方法可以实现列宽平分,但可能造成表头压缩。为解决这一问题,文章提出了通过计算字体像素占用宽度来动态设置列宽,确保内容清晰可见。这种方法结合表格内容、表头宽度和平均宽度,为每一列设置合适的宽度,提供了一种更为灵活的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}

这样的话,就可以根据找出最合适的宽度了。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值