注意:建议的解决方案仅对 OP 要求的基本情况有效(简单的 QStandardItemModel 或任何提供基本模型数据显示的子类模型);在此答案的底部阅读更多内容
您可以对模型进行子类化并覆盖data() 函数,以便在请求Qt.TextAlignmentRole 时返回正确的Qt.AlignmentFlag,默认情况下为无,除非使用setData() 或item.setTextAlignment() 手动设置:当返回值为None时,对齐方式由view决定,一般以系统布局方向为准。
在下面的示例中,您可以为任何列设置任意的默认对齐方式(或使用None 来恢复它),除非已按照上述方式明确设置对齐方式,否则将使用该对齐方式。
class AlignModel(QtGui.QStandardItemModel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.columnAlignments = {}
def setColumnAlignment(self, column, alignment):
if alignment:
self.columnAlignments[column] = alignment
elif column in self.columnAlignments:
self.columnAlignments.pop(column)
def data(self, index, role=QtCore.Qt.DisplayRole):
if role == QtCore.Qt.TextAlignmentRole:
return (super().data(index, role) or
self.columnAlignments.get(index.column()))
return super().data(index, role)
# set the center alignment for the *second* column:
model = AlignModel()
model.setColumnAlignment(1, QtCore.Qt.AlignCenter)
请注意,Qt.AlignCenter 暗示了Qt.AlignVCenter 和Qt.AlignHCenter(通过 OR 运算符),因此如果要向右或向左对齐,还必须提供垂直对齐方式:例如,@987654333 @。
一些重要说明:
作为indicated by eyllanesc,常见的建议是使用委托而不是子类化模型。虽然我的解决方案适用于需要非常简单的解决方案的情况(并且可以实际使用模型,但对于更高级别的类 QTreeWidget、QTableWidget 和 QListWidget 并非如此),但一般规则是模型应该 从不返回“更改”的内容:data() 的返回值应该始终反映索引的实际内容,并且任何修改(包括显示文本对齐等数据)都应该使用代理模型或通过更改委托的行为。
从 OOP 典型的模块化角度来看,这非常重要,特别是考虑到 MVC(或 MV,对于 Qt)模式:模型(真实数据)和视图(数据如何显示) 应该是不同的和独立的。
以这种情况为例:文本对齐。让我们假设对齐应该朝向第一列的“开始”:对于从右到左的语言,这意味着在右侧对齐文本(因为第一列在右边缘);如果模型要被序列化,结果是对齐将取决于序列化的 source 布局,而对齐应该完全取决于用户查看(反序列化)它的布局.
所以,这就是你应该问的问题:文本对齐对于模型重要(例如,数据可能包含具有不同书写方向的各种语言的文本)还是对于视图重要?如果其中任何一点都不重要,那么您必须考虑性能方面的最佳解决方案:例如,如果您将拥有一个非常大的模型(包含数千个条目,可能还有数百个项目同时显示),并且您确定某个列将始终具有相同的对齐方式,那么您可以覆盖 data() 或使用 QIdentityProxyModel,这肯定比使用委托和覆盖 @ 987654336@方法。
在任何其他情况下,委托解决方案是一种更正确和连贯的解决方案,因为它还允许以不同的方式显示相同的模型数据,无论内容是什么。