带有项目委托的QTListView - 所选项目的较高项目行

Jas*_*enX 5 qt

我有一个多选的启用QListView与Item委托(QStyledItemDelegate)我用来设置项目的大小和做自定义绘画.我的要求非常简单:

  1. 非选定项目的行高30
  2. 所选项目的行高60

无法让这个工作.

在我的QStyledItemDelegate上使用sizeHint尝试

if (option.state & QStyle::State_Selected)
{
  return QSize(100,60);   /// <<<<------ NEVER REACHED
}
else
{
  return QSize(100,30);
}
Run Code Online (Sandbox Code Playgroud)

永远不会选择状态,因为同一个if语句对于同一个类上的绘制方法非常有效,可以区分不同绘制背景的选定行和非选定行.

然后我尝试了别的东西

我使我的委托上的sizeHint方法可以访问选择模型(QItemSelectionModel).使用这个我可以成功查询是否选择了sizehint被调用的行,并且我返回正确的大小.但是现在只有绘图以正确的可变大小完成.对于所选项目,图形现在的高度为60,这是正确的,但它与下面的项目重叠.换句话说:新的sizeHint大小仅用于DRAWING,但不能用于实际使QListView项更高.似乎缺少一个"更新"listView的调用,其中一个项目的大小发生了变化.我不需要仅仅将物品拉得更高,我需要物品更高才能达到这个目的.

似乎sizeHint只在初始化所有内容时对项目高度产生影响.如果您突然从sizeHint中为其中一个项目返回更高的高度值 - 它不会增加listview以适应新的高度.

一个有趣的观察:

如果我在QListView上设置setResizeMode(QListView :: Adjust),稍微调整一下控件就会触发所有项目的重新计算,修复实际所选项目的大小,如图纸(总是在正确的情况下完成)由于项目高度现在正确,因此不会在下面的项目上级联.这是我需要做的选择更改,导致像QLiustView :: Adjust原因的"重新计算".我怎么做?

我现在正在做的事情是丑陋的,我很肯定这不是这样做的,但我别无选择.我正在联系选择模型 - 听取选择更改,当它们到来时,我将我的QlistView的高度调整为1然后再回到原始大小.这会生成一个项目大小的重新计算(setResizeMode(QListView :: Adjust),一切看起来都很好.我只是因为必须这样做而感到恶心 - 是不是没有更好的方法来使项目重新计算他​​们的身高通过伪造QListView的大小调整?

Jas*_*enX 2

与顶级诺基亚 Qt 开发人员确认 - 我正在做的黑客显然是完成这件事的唯一方法:

我现在所做的事情很丑陋,我确信这不是办法,但我别无选择。我正在连接选择模型——监听选择更改,当它们出现时,我将 QlistView 的高度调整 1,然后返回到原始大小。这会生成项目大小的重新计算(setResizeMode(QListView::Adjust),并且一切看起来和工作正常