PyQt6 QTableView垂直表头Win10无分割线问题咨询
问题结论
该现象属于Qt跨平台原生样式适配的正常差异,既非配置遗漏,也不是PyQt6的已知Bug。Qt默认会自动适配当前操作系统的原生控件视觉规范:Win10原生控件规范默认隐藏垂直表头与内容区域的分割线,KDE桌面的默认样式则默认开启该分割线,因此出现跨平台显示差异。macOS平台默认表现与Win10一致,同样不会显示该分割线。
解决方法
以下两种方案均可实现跨平台显示效果统一:
方案1:仅添加垂直表头分割线,不修改其他全局样式
在QTableView配置完成后添加样式规则即可,示例代码如下:# 给垂直表头的每个 section 添加右侧边框,即分割线 self.table.verticalHeader().setStyleSheet("QHeaderView::section { border-right: 1px solid #d0d0d0; }")边框颜色可根据实际设计需求调整,也可设置为系统默认边框色值。
方案2:全局使用跨平台统一样式
强制指定Qt使用跨平台统一的Fusion样式,所有操作系统下控件效果完全一致,默认自带垂直表头分割线,无需额外配置。只需在QApplication初始化后添加一行代码:app.setStyle("Fusion")
完整可运行代码(采用方案2)
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView from PyQt6.QtCore import Qt, QAbstractTableModel class TableModel(QAbstractTableModel): def __init__(self, data): super().__init__() self._data = data def data(self, index, role): if role == Qt.ItemDataRole.DisplayRole: value = self._data[index.row()][index.column()] return value def rowCount(self, index): return len(self._data) def columnCount(self, index): return len(self._data[0]) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.table = QTableView() data = [ [7, 9, 2], [1, -1, -1], [3, 5.3, -5], [3, 3, 2], [7, 8, 23], ] self.model = TableModel(data) self.table.setModel(self.model) self.setCentralWidget(self.table) if __name__ == "__main__": app = QApplication(sys.argv) # 全局指定Fusion样式,统一跨平台显示效果 app.setStyle("Fusion") window = MainWindow() window.show() sys.exit(app.exec())
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

