如何使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
相关产品推荐
相关产品推荐

