gpt4 book ai didi

带有项目委托(delegate)的 QTListView - 选定项目的更高项目行

转载 作者:行者123 更新时间:2023-12-04 12:51:29 27 4
gpt4 key购买 nike

我有一个启用了多项选择的 QListView 和一个项目委托(delegate) (QStyledItemDelegate),我用于设置项目的大小和进行自定义绘制。我的要求非常简单:

  • 非选定项目的行高 30
  • 所选项目的行高 60

  • 无法让这个工作。

    尝试在我的 QStyledItemDelegate 上使用 sizeHint
    if (option.state & QStyle::State_Selected)
    {
    return QSize(100,60); /// <<<<------ NEVER REACHED
    }
    else
    {
    return QSize(100,30);
    }

    状态从未被选中,这很奇怪,因为相同的 if 语句非常适用于同一类上的绘制方法,区分不同绘制背景的选定行和未选定行。

    然后我尝试了别的

    我让我的委托(delegate)上的 sizeHint 方法可以访问选择模型 (QItemSelectionModel)。使用它我可以成功查询是否选择了调用 sizehint 的行并且我返回了正确的大小。然而,现在只有绘图以正确的可变尺寸完成。对于选定的项目,绘图现在的高度为 60,这是正确的,但它与它下面的项目重叠。换句话说: 新的 sizeHint 尺寸仅用于 DRAWING ,但不是为了让 QListView 项目更高。似乎缺少一个调用来“更新”listView,它的一个项目的大小已经改变。我不仅需要将项目拉高,我需要将项目添加到 更高为了这个目的。

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

    一个有趣的观察:

    如果我在 QListView 上设置 setResizeMode(QListView::Adjust),对控件的轻微调整将触发所有项目的重新计算,从而修复实际选定项目的大小,例如绘图(始终以正确的方式完成height) 不会层叠在下面的项目上,因为项目高度现在是正确的。这是我在选择更改时需要做的,导致像 QLiustView::Adjust 这样的“重新计算”原因。我怎么做?

    我现在正在做的事情很丑陋,我很肯定这不是这样做的,但我别无选择。我正在连接选择模型——监听选择变化,当它们出现时,我将 QlistView 的高度调整为 1,然后返回到原始大小。这会重新计算项目大小(setResizeMode(QListView::Adjust) 并且一切看起来和工作正常。我只是因为不得不这样做而感到恶心——没有更好的方法来让项目重新计算它们的高度吗?通过伪造 QListView 的大小调整?

    最佳答案

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

    What I'm doing now is ugly, and I'm positive it's not way to do this, but I have no other alternative. I am hooking up to the selection model -- listening on selection changes, and when they come, i resize my QlistView's height by 1 and then go back to the original size. This generates a recalculation of the item sizes (setResizeMode(QListView::Adjust) and everything looks and works fine.

    关于带有项目委托(delegate)的 QTListView - 选定项目的更高项目行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139970/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com