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

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,提问作者オパラ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:36:24