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

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