PySide6中QAbstractTableModel的AlignCenter居中对齐不生效问题
问题描述
表格单元格数据无法居中显示。该功能此前运行正常,未修改模型类代码的情况下突然出现居中失效,故障原因暂不明确。
提供的最小可复现示例(MRE)代码如下:
from PySide6 import QtWidgets as qtw from PySide6 import QtCore as qtc class Model(qtc.QAbstractTableModel): def __init__(self): super().__init__() self._data = [ [1, 2], [3, 4], [5, 6] ] def data(self, index: qtc.QModelIndex, role: qtc.Qt.ItemDataRole = qtc.Qt.ItemDataRole.DisplayRole): if not index.isValid(): return None if role == qtc.Qt.ItemDataRole.TextAlignmentRole: return qtc.Qt.AlignmentFlag.AlignCenter if role == qtc.Qt.ItemDataRole.DisplayRole: return self._data[index.row()][index.column()] return None def rowCount(self, _): return len(self._data) def columnCount(self, _): return len(self._data[0]) class MainWindow(qtw.QMainWindow): def __init__(self): super().__init__() self._table = qtw.QTableView() self._table.setModel(Model()) self.setCentralWidget(self._table) self.show() app = qtw.QApplication() mw = MainWindow() app.exec()
解答
代码存在编写错误,问题出在TextAlignmentRole的返回值上:
- Qt6(含PySide6)的枚举类型校验比Qt5更严格,
TextAlignmentRole需要返回同时包含水平、垂直两个维度的对齐标志,仅返回AlignCenter(仅水平居中属性)会被判定为无效值,直接被QTableView忽略。这也是没改代码却突然失效的核心原因——通常是PySide6版本升级后,取消了旧版本自动补全垂直对齐属性的隐式逻辑。 - 修正方式:将对齐返回值改为水平居中和垂直居中的组合标志即可,修改后的对应代码段:
if role == qtc.Qt.ItemDataRole.TextAlignmentRole: return qtc.Qt.AlignmentFlag.AlignHCenter | qtc.Qt.AlignmentFlag.AlignVCenter
如果需要兼容多个PySide6版本,也可以在返回时将枚举值转为整数,避免类型不匹配问题:return int(qtc.Qt.AlignmentFlag.AlignHCenter | qtc.Qt.AlignmentFlag.AlignVCenter)。
内容的提问来源于stack exchange,提问作者オパラ
相关产品推荐
相关产品推荐

