【问题标题】:In QT, How to define the geometry for the Layout in a custom Widget在 QT 中,如何在自定义 Widget 中定义布局的几何形状
【发布时间】:2015-05-29 21:40:13
【问题描述】:

在自定义的QWidget(比如MyWidget)中,我包含一个布局来管理子小部件:

MyWidget window;
QPushButton button;
QVBoxLayout layout(window);
layout.addWidget(button);
window.show();

我希望布局处于特定位置和大小,默认情况下,QWidget 将其设置为整个几何图形。

我如何设置layout 将考虑管理其空间的几何形状?

作为间接问题: 布局使用哪个函数来设置子几何图形?

【问题讨论】:

    标签: c++ qt layout qwidget


    【解决方案1】:
    QPushButton *button = new QPushButton;
    verticalLayout->addSpacing(300);
    verticalLayout->addWidget(button);
    button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    button->setMinimumSize(500, 200);
    button->setMaximumSize(500, 200);
    

    如果您需要垂直和水平间距 - 使用 QGridLayout

    【讨论】:

    • 这对于特定的 GUI 来说是一个很好的答案,但不能作为问题的通用解决方案。问题是关于如何从自定义小部件的角度定义布局使用的内部几何图形。也很容易重写布局的“setGeometry”函数来设置QRect;但同样,这不是一个通用的解决方案。
    • 如果您需要固定窗口大小和固定小部件的位置 - 您只是不使用布局。
    • 我不需要固定的大小和位置,而是以允许在内部设置任何布局和任何 GUI 的方式实现 MyWidget。
    • QGraphicsView + QGraphicsScene + QGraphicsWidget 能解决您的问题吗?
    • 我目前正在尝试覆盖“MyWidget::contentsMargins”,但它不起作用,因为“QWidget” 基本功能不是虚拟的。编写代码来保持原生边距和布局的边距似乎是一种解决方案,但它一点也不优雅。
    【解决方案2】:

    QLayout 将两者的摘要用作边距:

    • 父窗口小部件内容边距。
    • 布局内容的边距。

    解决方案是在自定义小部件构造函数中将内容边距设置为所需的值。并在创建布局时,将其内容边距设置为 0。

    this->setContentsMargins(left, top, right, bottom);
    // ...
    layout->setContentsMargins(0,0,0,0);
    

    Layout setGeometry 被QWidget resize 事件调用,并根据它设置子widgets 的大小。由于所有功能都不是虚拟的,因此不可能(或至少难以)在此行为中进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2016-11-21
      • 2019-03-02
      相关资源
      最近更新 更多