You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现QTableView列宽按比例自适应?为何setWordWrap不生效?

嘿,这两个问题我都碰到过,给你详细说下解决方案:


问题1:实现列宽按比例平分且随窗口自动调整

你现在的代码里调用了resizeColumnsToContents(),这会让列宽跟着内容走,正好和你的需求相反,所以首先要把这个调用删掉。然后我们可以利用QHeaderView的Stretch模式来让所有列自动平分表格的可用水平空间,窗口大小变化时也会自动更新宽度。

具体修改:

  1. 在GUI类的__init__方法里,给水平表头设置拉伸模式:
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

这行代码会让所有列平分表格的宽度,不管内容多长,每列都会占1/3的空间(3列的情况下),窗口拉大拉小时也会自动调整。

  1. 删掉populate方法里的self.tableView.resizeColumnsToContents(),这行代码会覆盖我们的拉伸设置,必须去掉。

问题2:setWordWrap(True)不生效的原因及解决

你已经开启了setWordWrap(True),但还缺关键一步:让行高自动适应换行后的内容。默认情况下QTableView的行高是固定的,就算文本换行了,行高不够也看不出来。

解决方法很简单,在__init__里给垂直表头设置自动适应内容的模式:

self.tableView.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)

这样每行的高度会根据单元格里的换行文本自动调整,你就能看到文本换行的效果了。

另外可以加个小优化,设置单元格文本左对齐并添加内边距,让换行后的排版更整齐:

from PyQt5.QtCore import Qt
self.tableView.setStyleSheet("QTableView::item { text-align: left; padding: 4px; }")

修改后的完整test.py代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
from PyQt5 import uic
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QDialog, QApplication, QHeaderView
from PyQt5.QtCore import Qt

class GUI(QDialog):
    def __init__(self):
        super(GUI, self).__init__()
        dirname = os.path.dirname(os.path.abspath(__file__))
        uic.loadUi(os.path.join(dirname,'main.ui'), self)
        # button
        self.btnPopulate.clicked.connect(self.populate)
        # table model
        self.header = ['col1', 'col2', 'col3']
        self.QSModel = QStandardItemModel()
        self.QSModel.setColumnCount(3)
        self.QSModel.setHorizontalHeaderLabels(self.header)
        # table view settings
        self.tableView.setModel(self.QSModel)
        self.tableView.setWordWrap(True)
        # 列宽平分,随窗口自动调整
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        # 行高自动适应换行内容
        self.tableView.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        # 优化单元格排版
        self.tableView.setStyleSheet("QTableView::item { text-align: left; padding: 4px; }")
        self.tableView.horizontalHeader().setStretchLastSection(False)

    def populate(self):
        self.longtext = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac tellus nunc. Phasellus imperdiet leo metus, et gravida lacus. Donec metus ligula, elementum at pellentesque pellentesque, suscipit ac nunc.'''
        row = self.QSModel.rowCount()
        for x in range(7):
            self.QSModel.insertRow(row)
            self.QSModel.setData(self.QSModel.index(row, 0), 'Lorem ipsum')
            self.QSModel.setData(self.QSModel.index(row, 1), self.longtext)
            self.QSModel.setData(self.QSModel.index(row, 2), 'Lorem ipsum')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = GUI()
    window.show()
    sys.exit(app.exec_())

内容的提问来源于stack exchange,提问作者Nemo XXX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:11