resizeColumnToContent在自定义模型和委托下无法工作

2 投票
1 回答
600 浏览
提问于 2025-04-18 05:09

我正在使用QTreeView来显示一个自定义模型,里面有4列。这个基本上是可以工作的,但我就是无法让resizeColumnToContent这个功能正常运作。

我试过这个:

ui->treeSkills->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
ui->treeSkills->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
ui->treeSkills->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
ui->treeSkills->header()->setSectionResizeMode(3, QHeaderView::ResizeToContents);

还有这个:

ui->treeSkills->resizeColumnToContents(0);
ui->treeSkills->resizeColumnToContents(1);
ui->treeSkills->resizeColumnToContents(2);
ui->treeSkills->resizeColumnToContents(3);

无论是在设置数据之前还是之后,都没有任何效果。

我猜可能是因为在请求某个角色时,我需要在model::data()里返回一个大小。但这不太可能,因为每个单元格的实际文本或内容是在代理中确定的,而不是在模型里。

另一个猜测是直接在代理的paint()函数里改变矩形的大小,像这样:

options.rect.setWidth(options.rect.width() * 2);
p_painter->save();
p_painter->setClipRect(options.rect);

drawBackground(p_painter, options, p_index);
drawDisplay(p_painter, options, options.rect, text);
drawFocus(p_painter, options, options.rect);

p_painter->restore();

但同样,还是没有任何变化。

有没有什么想法可以解决这个问题?考虑到Qt在其他地方的布局都运作得很好,这个问题真的是很奇怪。

1 个回答

0

我遇到了同样的问题,最后发现是我在自定义模型中设置了 SizeHintRole

def data(self, index, role):
  ...
  if role == QtCore.Qt.SizeHintRole:
     return QtCore.QSize(-1, 22)

在这里,我试图给所有行设置一个固定的垂直大小,结果也影响到了宽度。我不确定你的情况是不是这样,但我建议你检查一下你的 data() 定义(或者甚至 headerData())。

撰写回答