【问题标题】:Qt: How can I align widgets in two different QGridLayouts?Qt:如何在两个不同的 QGridLayouts 中对齐小部件?
【发布时间】:2019-09-27 18:44:25
【问题描述】:

我正在尝试排列来自两个不同 QGridLayouts 的小部件。想法如下:我在滚动框架的 QGridLayout 中有很多行小部件。每行可能包含 8 列其他小部件(因此是 8xN 小部件的网格,N = 行数)。该行中的第一个小部件是一个显示/隐藏按钮,选中该按钮后,将在该行下方显示另一个具有相同布局的小部件(即,显示的小部件具有多行小部件,每行有 7 列小部件)。因此,显示的小部件最初会被插入,并在切换显示按钮时显示/隐藏。

下图说明了我的设置。标记为“A”的红色括号指示的小部件是我在选中左侧复选框时显示的小部件(它们没有自己的显示按钮)。

我需要解决的问题是如何让显示的小部件与所有其他小部件对齐。我在这里想到了两个选择:

  • 将所有小部件放在相同的布局中,然后循环浏览我需要显示/隐藏的小部件。这样做的好处是所有小部件都排列整齐,因为它们处于相同的布局中。不好的是,如果我有数百行小部件(这很常见),则需要很长时间才能将它们全部显示出来。
  • 将子小部件放入它们自己的容器小部件中,并让显示/隐藏按钮简单地显示/隐藏那个小部件。好处是这比显示/隐藏每个单独的小部件要快得多,但不好的一面是小部件现在没有排列,因为子小部件处于不同的布局中。我认为这是更好的选择。我只需要弄清楚如何对齐所有类似的小部件。

希望这很清楚。我正在使用 Qt 5.11。提前感谢您的帮助。

【问题讨论】:

    标签: qt qt5 qgridlayout


    【解决方案1】:

    好吧,如果您有太多小部件,以至于在现代计算机上加载速度很慢,您可能希望完全采用不同的策略,即“延迟”加载实际的小部件。即使是隐藏的,它们也需要时间来生成、记忆来存储等等。 OTOH 模型/视图框架之类的东西在请求编辑之前显示相对轻量级的仅显示标签,然后才绘制(相对)复杂的编辑器小部件。并且视图具有按需加载额外数据(延迟加载)的规定,这正是您要寻找的。​​p>

    但无论如何要回答您的问题,您基本上需要跟踪“参考”网格(可能是您的第一个)的宽度,并手动在任何其他网格上设置网格列。这并不难,因为您可以轻松地遍历列并调用QGridLayout::setColumnMinimumWidth()。替代“参考网格”的另一种选择是自己计算列宽(当然,如果您想适应内容宽度,这会涉及更多)。

    QGridLayout gl1;
    gl1.setSizeConstraint(QLayout::SetMinimumSize);  // maybe
    
    gl1.addWidget(..., 0, 0);
    gl1.addWidget(..., 0, 1);
    gl1.addWidget(..., 0, 2);
    gl1.activate();  // or show it or something... it needs to calculate its sizeHint().
    
    QVector<int> colWidths;
    for (int i=0; i < gl1.columnCount(); ++i)
      colWidths << gl1.columnMinimumWidth(i);
    
    QGridLayout gl2;
    gl2.addWidget(..., 0, 0);
    gl2.addWidget(..., 0, 1);
    gl2.addWidget(..., 0, 2);
    
    for (int i : colWidths)
      gl2.setColumnMinimumWidth(i);
    

    这可能很简单,但本质上您需要一种“蛮力”方法来使用单独的布局。如果布局中的小部件具有固定宽度,这将有很大帮助,并且如果您提前知道它们,那么它会变得更加容易。对布局类型进行子类化、滚动您自己的布局或从单独的 H/V 盒布局中组装出一个网格也可能会有所帮助。

    但实际上,只要你说“数百个小部件”,我就会认为“不”。 BTDT。如果情况真的那么绝望,我会看看模型/视图框架,也许考虑实现我自己的QAbstractItemView。 :)

    【讨论】:

    • 这些想法很棒,谢谢。有这么多小部件的原因是因为我们正在比较列数据,其中有数百列。我们想要绘制图表并基本上编辑每一列的比较。我知道有不同的、更高效的小部件方法可以做到这一点,但我的老板想要简单,将小部件放在每列旁边很容易。无论如何,我会先研究暴力破解,因为它会更快,然后再研究模型/视图的东西,因为它看起来很复杂但更好。谢谢!
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2021-12-20
    相关资源
    最近更新 更多