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

如何去除QTableWidget单元格中多余的内边距与间距?

解决QTableWidget最后一列按钮多余间距问题

我在PyQt5中创建了一个QTableWidget,在最后一列添加了受QButtonGroup管理的QPushButton,组件功能正常,但最后一列按钮两侧存在明显的空白间距。看到相关问题提到用自定义委托实现绘制,但作为PyQt5新手,不确定这是否是正确的解决路径。

原代码如下:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class ModTableWidget(QTableWidget):
    def __init__(self):
        super().__init__(0, 3)
        self.setHorizontalHeaderLabels(["Alias", "Path", ""])
        
        self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
        self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
        self.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents) 
        self.setSelectionBehavior(QAbstractItemView.SelectRows)

        self.is_default_group = QButtonGroup()

        for item in range(10):
            self.addItem(str(item), str(item))

    def addItem(self, alias, path):
        last_row_index = self.rowCount()
        self.insertRow(last_row_index)

        alias_item = QTableWidgetItem()
        alias_item.setText(alias)
        self.setItem(last_row_index, 0, alias_item)

        path_item = QTableWidgetItem()
        path_item.setText(path)
        self.setItem(last_row_index, 1, path_item)

        is_default_btn = QPushButton("Btn")
        is_default_btn.setMaximumWidth(30)
        is_default_btn.setCheckable(True)

        self.is_default_group.addButton(is_default_btn)
        self.setCellWidget(last_row_index, 2, is_default_btn)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    tablewidget = ModTableWidget()
    tablewidget.show()

    sys.exit(app.exec_())

无需自定义委托的简单解决方法

方法1:用容器Widget消除单元格内边距

问题根源是QTableWidget的单元格默认存在内边距,直接放置按钮时会被这个内边距撑开列宽。可以给按钮套一个容器Widget,通过布局消除边距:

修改addItem方法中设置单元格部件的代码:

is_default_btn = QPushButton("Btn")
is_default_btn.setMaximumWidth(30)
is_default_btn.setCheckable(True)

# 创建容器Widget并设置布局,消除边距
container = QWidget()
layout = QHBoxLayout(container)
layout.setContentsMargins(0, 0, 0, 0)  # 移除布局的上下左右边距
layout.addWidget(is_default_btn)
layout.setAlignment(Qt.AlignCenter)  # 让按钮在单元格中居中

self.is_default_group.addButton(is_default_btn)
self.setCellWidget(last_row_index, 2, container)

方法2:全局设置单元格内边距(慎用)

如果希望所有单元格都去掉内边距,可以通过样式表实现:
在ModTableWidget的__init__方法中添加:

self.setStyleSheet("QTableWidget::item { padding: 0px; }")

但这种方式会影响所有列的单元格,若其他列需要保留内边距,不建议使用。

关于自定义委托的说明

自定义委托确实能解决这个问题,且更适合大量行的场景(性能更优),但对于新手来说学习成本较高。如果只是简单场景,上述两种方法足够解决问题。若后续需要优化性能,再考虑学习自定义委托的实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:24:13