自动调整QTableView列宽以适应窗口大小

问题描述

十年前,有人提出了一个问题:当我使用自定义模型来展示 QTableView,并固定了三列时,初始窗口显示正常,但当我调整窗口大小时,QTableView 会随之调整大小,而列宽却保持不变。我想让列宽在每次调整窗口大小时都能适应 QTableView 的宽度。

解决方法

以下是几种实现方法:

方法一:均匀拉伸每列宽度

这种方法使用 QHeaderView::Stretch 模式,确保所有列的宽度在表格内均匀分布。示例如下:

cpp 复制代码
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

这种方法通过调用 setSectionResizeMode 方法来完成。详细文档可以参考 QHeaderView::setSectionResizeMode

方法二:自动拉伸最后一列,并手动调整每一列宽度

如果希望最后一列填充父窗口的剩余空间,可以使用如下方法:

cpp 复制代码
table_view->horizontalHeader()->setStretchLastSection(true);

但该方法不会按比例调整其他列的宽度。如果需要所有列按比例调整,可以在父窗口的 resizeEvent 中手动进行:

cpp 复制代码
void QParent::resizeEvent(QResizeEvent *event) {
    int total_width = this->width();
    int column_count = 3; // 假设有3列
    for (int i = 0; i < column_count; i++) {
        table_view->setColumnWidth(i, total_width / column_count);
    }
    QMainWindow::resizeEvent(event);
}

其中,QParentQMainWindow 的子类。

方法三:使用 QHeaderView 设置模式

可以通过设置 QHeaderView 的相关方法来调整列的宽度:

拉伸最后一列:
cpp 复制代码
QTableView *table = new QTableView();
table->horizontalHeader()->setStretchLastSection(true);
设置所有列拉伸或按内容调整大小:
cpp 复制代码
QTableView *table = new QTableView();
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

或者:

cpp 复制代码
table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

需要注意的是,ResizeToContents 模式会根据内容调整列宽,但会禁止手动和编程方式调整列宽。

方法四:在 PyQt5 中实现

在 PyQt5 中,可以通过以下方式实现同样的效果:

python 复制代码
header = table_widget.horizontalHeader()
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)

对于 PyQt6,方法稍有不同:

python 复制代码
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeMode.ResizeToContents)

性能问题

需要注意的是,ResizeToContents 模式在处理大规模数据时可能会影响性能。例如,当表格包含上万条数据时,可能需要几秒钟来重新绘制。

小结

以上各种方法可以根据具体需求选择使用。如果追求简单和均匀,可以选择 QHeaderView::Stretch。如果需要更精细的控制,可以选择在 resizeEvent 中手动调整每列宽度。对于处理大数据量时的性能问题,应谨慎选择 ResizeToContents 模式。

相关推荐
cookqq25 分钟前
mongodb源码分析session异步接受asyncSourceMessage()客户端流变Message对象
数据库·sql·mongodb·nosql
呼拉拉呼拉37 分钟前
Redis故障转移
数据库·redis·缓存·高可用架构
什么都想学的阿超40 分钟前
【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
数据库·redis·架构
pp-周子晗(努力赶上课程进度版)1 小时前
【MySQL】视图、用户管理、MySQL使用C\C++连接
数据库·mysql
斯特凡今天也很帅1 小时前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
超级小忍2 小时前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税3 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hshpy3 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
文牧之4 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
篱笆院的狗4 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存