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

Python3.8+PyQt5中如何正确设置QTableWidget的尺寸?

QTableWidget尺寸调整解决方案

你的代码存在布局冲突问题,导致表格尺寸无法按预期控制,调整后完全可以实现蓝线标注的大小效果,具体修改如下:

核心问题修正

在createTable方法中调用self.setLayout(self.vbox)是错误的——QMainWindow已经通过setCentralWidget设置了带网格布局的中心部件,重复设置主窗口布局会导致布局混乱,直接移除该行即可。

尺寸控制方案

根据需求选择以下一种方式调整表格大小:

1. 固定尺寸(精准匹配蓝线)

直接给表格设置固定宽高,完全符合标注尺寸:

def createTable(self, pdfsn =[]):
    self.tableWidget = QTableWidget(self.centralWidget())
    self.tableWidget.setColumnCount(3)
    headers = ["PDF SN", "APPSHEET SN", "IS MATCH"]
    self.tableWidget.setHorizontalHeaderLabels(headers)

    # 设置表格固定宽高(替换为蓝线标注的实际数值)
    self.tableWidget.setFixedSize(320, 200)
    # 可选:手动设置列宽,让内容布局更合理
    self.tableWidget.setColumnWidth(0, 110)
    self.tableWidget.setColumnWidth(1, 110)
    self.tableWidget.setColumnWidth(2, 100)

    self.vbox = QVBoxLayout()
    self.vbox.addWidget(self.tableWidget)
    # 移除错误的 self.setLayout(self.vbox)

2. 布局自适应(随窗口调整)

让表格通过布局占据指定区域,同时自动适配窗口大小:

def initUI(self):
    w = QtWidgets.QWidget()
    self.setCentralWidget(w)
    grid = QtWidgets.QGridLayout(w)
    # ... 其他控件代码不变 ...

    self.createTable()

    # 修改表格布局的添加方式,让它跨3列并占据剩余空间
    grid.addLayout(self.vbox, 3, 0, 1, 3)
    # 设置网格布局的行拉伸,让第3行(表格所在行)占据窗口剩余空间
    grid.setRowStretch(3, 1)

def createTable(self, pdfsn =[]):
    self.tableWidget = QTableWidget(self.centralWidget())
    self.tableWidget.setColumnCount(3)
    headers = ["PDF SN", "APPSHEET SN", "IS MATCH"]
    self.tableWidget.setHorizontalHeaderLabels(headers)

    # 设置列自动拉伸填充表格宽度
    self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)

    self.vbox = QVBoxLayout()
    self.vbox.addWidget(self.tableWidget)
    # 移除错误的布局设置
    # self.setLayout(self.vbox)

完整修改后的代码

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.setGeometry(200, 200, 400, 400)
        self.setWindowTitle('OIL-CheckOrder')
        self.initUI()

    def initUI(self):
        w = QtWidgets.QWidget()
        self.setCentralWidget(w)
        grid = QtWidgets.QGridLayout(w)

        self.textbox = QLineEdit(self)
        self.textbox.setText('File')
        self.textbox.setReadOnly(True)

        self.textbox2 = QLineEdit(self)
        self.textbox2.setText('Order number')

        size = QSize(40, 40)

        self.b1 = QtWidgets.QPushButton(self)
        self.b1.setIcon(QIcon('./search.jpg'))
        self.b1.setIconSize(size)
        self.b1.clicked.connect(self.File_path)

        self.run = QtWidgets.QPushButton(self)
        self.run.setIcon(QIcon('./start.jpg'))
        self.run.setIconSize(size)
        self.run.clicked.connect(lambda path: self.loaddata(self.path))

        self.createTable()

        grid.addWidget(self.b1, 0, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
        grid.addWidget(self.textbox, 1, 0, 1, 3)
        grid.addWidget(self.textbox2, 2, 0, 1, 3)
        grid.addWidget(self.run, 0, 2, QtCore.Qt.AlignRight | QtCore.Qt.AlignTop)
        # 修改表格布局的添加方式,跨3列并设置行拉伸
        grid.addLayout(self.vbox, 3, 0, 1, 3)
        grid.setRowStretch(3, 1)

    def createTable(self, pdfsn =[]):
        self.tableWidget = QTableWidget(self.centralWidget())
        self.tableWidget.setColumnCount(3)

        headers = ["PDF SN", "APPSHEET SN", "IS MATCH"]
        self.tableWidget.setHorizontalHeaderLabels(headers)

        # 可选:设置固定尺寸或列拉伸,二选一启用
        # 方式1:固定尺寸
        # self.tableWidget.setFixedSize(320, 200)
        # self.tableWidget.setColumnWidth(0, 110)
        # self.tableWidget.setColumnWidth(1, 110)
        # self.tableWidget.setColumnWidth(2, 100)

        # 方式2:列自动拉伸
        self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)

        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.tableWidget)
        # 移除错误的布局设置
        # self.setLayout(self.vbox)

内容的提问来源于stack exchange,提问作者Michał B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:20:42