【问题标题】:Qt QGridLayout automatically centers (moves) items to the middle.Qt QGridLayout 自动将项目居中(移动)到中间。
【发布时间】:2012-12-11 14:48:28
【问题描述】:

我的表单上有一个QHBoxLayout,其中添加了 3 个布局。第二个是关于我的问题的项目。

我在主布局的第二个窗格(QHBoxLayout)上有一个QVBoxLayout。 这个QVBoxLayout 添加了一个QScrollAreaaddWidget

这个QScrollArea 是一个名为“scrollContents”的QWidget 的父级,而后者又包含一个QGridLayout

我正在向这个具有固定高度的QGridLayout 添加一个自定义创建的小部件。我们现在可以考虑这个100px

如果此QGridLayout 包含总高度小于表单本身的项目,则它将这些小部件垂直居中,并且它们之间的间距相同。

如果只有一个小部件,它会显示在中间。但我希望它们从上到下列出。

例如:[### 表示QScrollArea 的区域,其中有一个QWidget QGridLayout

   OK      ->   DESIRED    -> NOT DESIRED AND WHAT HAPPENS
##########    ##########               ##########
# |item| #    # |item| #               #        #
# |item| #    #        #               #        #
# |item| #    #        #               #        #
# |item| #    #        #               # |item| #
# |item| #    #        #               #        #
# |item| #    #        #               #        #
# |item| #    #        #               #        #
##########    ##########               ##########
  |item|
  |item| 
  |item|

基本上:如果有 9 个“行”的空间,则添加单个项目时,它会出现在中间的第 5 个位置。如果有 9 个或更多,它们将按应有的方式显示。如果有 8 个或更少,则它们之间的空间会扩大到全部居中。

我该如何解决这个问题?

谢谢。

【问题讨论】:

    标签: c++ python qt qscrollarea qgridlayout


    【解决方案1】:

    在底部使用垂直间隔,这就是它们的用途。

    【讨论】:

    • 我对您的解决方案很感兴趣,但是 GridLayout 中的间隔符是什么?没有像 QHBoxLayout 和 QVBoxLayout 那样的 addStretch() 这样的方法。
    【解决方案2】:

    还有一种不同于 trollixx 回答的方法:在QGridLayout 的“底部”添加一个虚拟小部件,其垂直大小策略设置为展开。见this answer, which also contains an example with a toolbar

    【讨论】:

    • 你好@Synxis!谢谢回复。我会牢记这一点,并将其放在我的工具箱中以供将来参考。 ;-) 再次感谢!
    • 不客气。别忘了你不仅可以将它用于工具栏,还可以用于 QGridLayout 的问题!
    • 你好@Synxis。我已经完成了各种测试并阅读了一些 Qt 文档。我相信您建议的这种方法是一种更好的解决方案。因为:如果添加的项目不多,它就可以工作。如果项目被删除,它会起作用。如果重新添加项目,它会起作用。因此,我选择你的答案是 the 答案。我希望它会在未来对其他人有所帮助。如果您不介意我说的话,也许如果您编辑您的消息以通过可能对链接问题中所写内容的代码引用进行更多解释,那会很酷。再次感谢。
    【解决方案3】:

    QGridLayout::addWidget()alignment 参数。以下代码适用于我:

    gridLayout->addWidget(new QPushButton("Button"), 0, 0, Qt::AlignTop);
    

    【讨论】:

    • 它就像一个魅力!唯一的问题是,它不尊重 setContentMargins() 参数。我会寻找它,但如果你也有这方面的经验,我会非常感激,非常感谢! ;-)
    • 这很奇怪,因为我尝试了gridLayout->setContentsMargins(50, 50, 50, 50);,它确实做到了。
    • 你是对的。我有一些有限的软件发短信功能,它们会自动添加、删除、读取随机数量的小部件,我在那里做了一些编码错误。所以你实际上是绝对正确的。这段代码做了它应该做的,但是当有更多的添加和删除时它就缺少了。因此,如果您不介意,我将选择另一篇文章作为答案,因为在我的情况下,它更像是一个可靠的解决方案。但是,我会记住你的并在必要时使用它,所以我真诚地感谢你!干杯! ;-)
    • 在 PyQt from PyQt5.QtCore import * grid.addWidget(imgLabel, 0, 0, Qt.AlignTop)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多