【问题标题】:Sortable QHBoxLayout可排序的 QHBoxLayout
【发布时间】:2011-06-08 00:51:10
【问题描述】:

我正在使用 Qt 创建一个可排序的条形图式小部件。小部件的布局为图表中的每个条形(也是小部件)使用 QHBoxLayout。

当用户更改排序参数时,我的控制器会清除布局,对其进行排序,并按顺序在每个项目上调用 addWidget。我面临的问题是这个列表非常大(1000 多个小部件),并且 Qt 在尝试布局这么多元素时正在爬行。

我发现每次调用 addWidget 时,Qt 都会重新计算 QHBoxLayout 中每个项目的位置,然后更新。这是一个问题,因为它在我添加之前对每个 LayoutItem 执行了许多不必要的计算。对于我放入的 1000 个测试项目,重新处理大约需要 30 秒,这显然太长了。

是否有更好的 Layout 类型可供使用,或者是否有更快的方法将已排序的小部件集合添加到布局中?

编辑: 显然,我遇到的问题不在于 Qt 再次布置每个项目,而是在幕后进行的所有育儿和恶作剧的内部结构我建立了一个测试项目,将 1000 个按钮添加到布局中,打印每次出一个柜台。这些数字几乎是瞬间打印出来的,尽管 Qt 花了大约 30 秒的时间来整理自己。我认为问题不仅仅存在于 QHBoxLayout 中,还存在于 Qt 的布局系统中。看起来我将手动定位小部件并完全绕过 QLayout。感谢所有提供意见的人。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    来自void QLayout::setEnabled(bool enable)documenation

    如果 enable 为 true,则启用此布局,否则将其禁用。
    启用的布局会根据变化动态调整;禁用的布局就像它一样 不存在。
    默认启用所有布局。

    【讨论】:

    • 我接受了这一点,因为测试这帮助我发现问题是 QLayout 所固有的,而不仅仅是 QHBoxLayout。谢谢,@Piotr!
    【解决方案2】:

    如何制作一个 Graph 小部件(由 Bar(或您选择的任何名称)小部件组成)将包含您自己的 QLayout 子类优化此任务(因为您必须重新实现 QLayout::addItem() 在 QLayout 中是纯虚拟的)。

    另外,请务必查看Qwt,因为它可能已经实现了您想要的。

    【讨论】:

    • 我们之前研究过 qwt,但由于我公司的许可问题,我们决定不在项目中使用它。编写自定义 QLayout 是我目前的计划,但由于 QHBoxLayout 已经按照我想要的方式进行布局,我宁愿使用它(或子类化它)而不是重新发明轮子。这似乎是一个普遍的问题,但也许我的想法是错误的。
    • @Dave McClelland 恐怕您将无法摆脱您为 QHBoxLayout 描述的仅使用 QHBoxLayout 的子类的“不必要的计算”问题,这是因为 addItem() 是不是虚拟的。但是,您可以从 QHBoxLayout 的 addItem() 代码中“获得灵感”,然后巧妙地摆脱“不必要的计算”部分 :)
    【解决方案3】:

    也许您可以创建一个没有父级的新 QHBoxLayout,将您的小部件添加到此布局中,然后删除旧的 QHBoxLayout 并插入您的新布局。警告:我没有尝试过。

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2012-09-20
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      相关资源
      最近更新 更多