具有项目委托的QT ListView - 所选项目的较高项目行

时间:2011-11-15 16:50:01

标签: qt

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

  1. 非选定项目的行高30
  2. 所选项目的行高60
  3. 无法让它发挥作用。

    尝试使用我的QStyledItemDelegate上的sizeHint

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

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

    然后我尝试了别的东西

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

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

    一个有趣的观察结果:

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

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

1 个答案:

答案 0 :(得分:1)

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

  

我现在正在做的事情是丑陋的,而且我很肯定它不是这样做的,   但我别无选择。我正在接受选择   模型 - 听取选择变化,当他们来时,我调整大小   我的QlistView的高度为1,然后回到原始大小。这个   生成重新计算项目大小   (setResizeMode(QListView :: Adjust),一切看起来都很好