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

如何在PyQt5 QTableWidget中将列宽设置为小于1的数值?

实现QTableWidget窄缝隙视觉效果的方案

由于Qt的UI元素尺寸以像素为最小单位,无法设置小于1像素的列宽,因此可以通过视觉模拟的方式实现窄缝隙效果,以下是两种可行方案:

方案一:移除缝隙列,自定义绘制分隔线

直接在原有列之间绘制细线条替代额外的缝隙列,更简洁高效:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt

class CustomTableWidget(QTableWidget):
    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self.viewport())
        # 设置分隔线样式,可自定义颜色和宽度
        pen = QPen(Qt.gray, 1)
        painter.setPen(pen)
        painter.setRenderHint(QPainter.Antialiasing)
        
        # 计算分隔线位置,在第1、2列和第2、3列之间绘制
        col1_right = self.columnViewportPosition(1) + self.columnWidth(1)
        col2_right = self.columnViewportPosition(2) + self.columnWidth(2)
        
        # 绘制贯穿可视区域的垂直分隔线
        painter.drawLine(col1_right, 0, col1_right, self.viewport().height())
        painter.drawLine(col2_right, 0, col2_right, self.viewport().height())

class MyTable(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Narrow Columns Table')
        self.setGeometry(100, 100, 400, 300)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)

        self.create_table()

    def create_table(self):
        self.tableWidget = CustomTableWidget()
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(3)  # 移除原缝隙列,保留3个有效列
        self.tableWidget.setHorizontalHeaderLabels(["Col 0", "Col 2", "Col 4"])

        # 填充有效列内容
        for row in range(5):
            self.tableWidget.setItem(row, 0, QTableWidgetItem(f"Row {row}, Col 0"))
            self.tableWidget.setItem(row, 1, QTableWidgetItem(f"Row {row}, Col 2"))
            self.tableWidget.setItem(row, 2, QTableWidgetItem(f"Row {row}, Col 4"))

        self.layout.addWidget(self.tableWidget)

def run_app():
    app = QApplication(sys.argv)
    window = MyTable()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    run_app()

方案二:保留原列结构,隐藏缝隙列元素

如果需要维持原有5列的索引结构,可以通过隐藏缝隙列的内容、调整样式来模拟缝隙:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget, QStyledItemDelegate
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qt

class GapDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        # 缝隙列仅填充背景色,不绘制内容
        painter.fillRect(option.rect, QColor("#cccccc"))

class MyTable(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Narrow Columns Table')
        self.setGeometry(100, 100, 400, 300)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)

        self.create_table()

    def create_table(self):
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(5)

        # 隐藏缝隙列的表头
        header = self.tableWidget.horizontalHeader()
        header.hideSection(1)
        header.hideSection(3)

        # 给缝隙列设置自定义委托,仅显示背景色
        gap_delegate = GapDelegate()
        self.tableWidget.setItemDelegateForColumn(1, gap_delegate)
        self.tableWidget.setItemDelegateForColumn(3, gap_delegate)

        # 填充有效列内容
        for row in range(5):
            for col in range(5):
                if col not in (1, 3):
                    self.tableWidget.setItem(row, col, QTableWidgetItem(f"Row {row}, Col {col}"))

        # 设置缝隙列宽度为1像素,移除边框
        self.tableWidget.setColumnWidth(1, 1)
        self.tableWidget.setColumnWidth(3, 1)
        self.tableWidget.setStyleSheet("""
            QTableWidget::item:column(1), QTableWidget::item:column(3) {
                border: none;
            }
        """)

        self.layout.addWidget(self.tableWidget)

def run_app():
    app = QApplication(sys.argv)
    window = MyTable()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    run_app()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:11:11