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

如何使QStyleOptionSpinBox渲染模型值?表格SpinBox代理显示问题

解决QTableView SpinBox代理非编辑状态显示模型值的问题

问题出在自定义的paint方法里,你只绘制了SpinBox的控件框架,但没有把模型中的值绘制到单元格中。以下是两种可行的解决方式:

方法一:先绘制文本,再叠加SpinBox控件样式

修改paint方法,先获取模型值并绘制到单元格,再绘制SpinBox的框架:

def paint(self, painter, option, index):
    # 获取模型中的显示值并转为字符串
    value_text = str(index.model().data(index, Qt.ItemDataRole.DisplayRole))
    # 保存画笔状态,避免影响后续绘制
    painter.save()
    # 调整文本绘制区域,避开右侧的SpinBox箭头
    text_rect = option.rect.adjusted(10, 0, -30, 0)
    # 居中绘制文本,和SpinBox默认对齐一致
    painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, value_text)
    painter.restore()
    
    # 绘制SpinBox的控件框架
    spinBoxOption = QStyleOptionSpinBox()
    spinBoxOption.palette = option.palette
    spinBoxOption.state = option.state
    spinBoxOption.rect = option.rect
    QApplication.style().drawComplexControl(QStyle.ComplexControl.CC_SpinBox, spinBoxOption, painter)

方法二:复用父类绘制逻辑,仅添加SpinBox箭头

先调用父类的paint方法绘制文本,再单独绘制SpinBox的箭头部分:

def paint(self, painter, option, index):
    # 让父类完成文本的绘制工作
    super().paint(painter, option, index)
    # 配置SpinBox箭头的样式选项
    spinBoxOption = QStyleOptionSpinBox()
    spinBoxOption.palette = option.palette
    # 取消选中状态标记,避免覆盖已绘制的文本
    spinBoxOption.state = option.state & ~QStyle.StateFlag.State_Selected
    # 仅保留单元格右侧的箭头区域
    arrow_rect = option.rect.adjusted(option.rect.width()-30, 0, 0, 0)
    spinBoxOption.rect = arrow_rect
    # 绘制箭头控件
    QApplication.style().drawComplexControl(QStyle.ComplexControl.CC_SpinBox, spinBoxOption, painter)

补充:完善模型数据一致性

你的代码中仅设置了DisplayRole,虽然QStandardItem默认会同步EditRole的值,但显式设置可避免潜在问题:

for row in range(4):
    column = 0
    item = QStandardItem()
    value = (row + 1) * 25
    item.setData(value, Qt.ItemDataRole.DisplayRole)
    item.setData(value, Qt.ItemDataRole.EditRole)
    model.setItem(row, column, item)

修改后,非编辑状态下单元格会正常显示模型数值,同时保留SpinBox的上下箭头样式,编辑功能不受影响。

内容的提问来源于stack exchange,提问作者memelord23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:15:07