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

