如何去除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
相关产品推荐
相关产品推荐

