如何移除QTableWidget与QHeaderView外侧网格线仅保留内部网格线
实现方案
核心思路
默认QTableWidget的网格线属性功能有限,我们选择关闭原生网格线,通过单元格和表头的边框自定义绘制网格,既可以灵活调整粗细,也能方便控制仅显示内部网格,同时统一边框粗细即可解决表头和表格线条错位问题。
具体修改步骤
- 关闭原生网格线:在QTableWidget初始化代码中新增一行配置,关闭默认自带的网格线
self.listbox.setShowGrid(False)
- 替换原有样式表为以下内容,可自行调整
2px参数修改网格线粗细:
QTableWidget { padding-left: 50px; padding-right: 50px; border: none; } QTableWidget::item { border-right: 2px solid #9370DB; border-bottom: 2px solid #9370DB; padding: 4px; } QTableWidget::item:last-column { border-right: none; } QTableWidget::item:last-row { border-bottom: none; } QHeaderView::section:horizontal { border: none; border-right: 2px solid #9370DB; padding: 4px; background-color: #f0f0f0; } QHeaderView::section:horizontal:last { border-right: none; } QHeaderView::section:vertical { border: none; border-bottom: 2px solid #9370DB; padding: 4px; background-color: #f0f0f0; } QHeaderView::section:vertical:last { border-bottom: none; }
修改后完整可运行代码
from PySide6.QtCore import * # type: ignore from PySide6.QtGui import * # type: ignore from PySide6.QtWidgets import * # type: ignore import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.resize(800, 600) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.verticalLayout_2 = QVBoxLayout(self.centralwidget) self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.indicatorsLayout = QHBoxLayout() self.indicatorsLayout.setObjectName(u"indicatorsLayout") self.verticalLayout_2.addLayout(self.indicatorsLayout) self.listboxLayout = QGridLayout() self.listboxLayout.setObjectName(u"listboxLayout") self.listbox = QTableWidget(self.centralwidget) if (self.listbox.columnCount() < 5): self.listbox.setColumnCount(5) if (self.listbox.rowCount() < 10): self.listbox.setRowCount(10) self.listbox.setObjectName(u"listbox") # 关闭原生网格线 self.listbox.setShowGrid(False) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.listbox.sizePolicy().hasHeightForWidth()) self.listbox.setSizePolicy(sizePolicy) self.listbox.setStyleSheet(u""" QTableWidget { padding-left: 50px; padding-right: 50px; border: none; } QTableWidget::item { border-right: 2px solid #9370DB; border-bottom: 2px solid #9370DB; padding: 4px; } QTableWidget::item:last-column { border-right: none; } QTableWidget::item:last-row { border-bottom: none; } QHeaderView::section:horizontal { border: none; border-right: 2px solid #9370DB; padding: 4px; background-color: #f0f0f0; } QHeaderView::section:horizontal:last { border-right: none; } QHeaderView::section:vertical { border: none; border-bottom: 2px solid #9370DB; padding: 4px; background-color: #f0f0f0; } QHeaderView::section:vertical:last { border-bottom: none; } """) self.listbox.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.listbox.setSizeAdjustPolicy(QAbstractScrollArea.AdjustIgnored) self.listbox.setRowCount(10) self.listbox.setColumnCount(5) self.listbox.horizontalHeader().setCascadingSectionResizes(False) self.listbox.horizontalHeader().setDefaultSectionSize(100) self.listboxLayout.addWidget(self.listbox, 0, 0, 1, 1) self.verticalLayout_2.addLayout(self.listboxLayout) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 800, 22)) MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) # retranslateUi if __name__ == "__main__": app = QApplication(sys.argv) MainWindow = QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec())
内容的提问来源于stack exchange,提问作者conopizda2
相关产品推荐
相关产品推荐

