【问题标题】:Arrange widgets in layout在布局中排列小部件
【发布时间】:2017-06-09 16:53:12
【问题描述】:

我想实现以下布局行为:

    | A  |  B  |       | A  |     |
 1) |---- -----|    2) |----   D  |
    | C  |  D  |       | C  |     |

将 A、B、C、D 相互对齐,如果 B 被隐藏,则允许 D 占用可用空间。

我可以通过多种方式实现布局行为 1 或 2。但是如果不从布局中删除小部件并稍后在 B 使用 qt 默认布局隐藏/显示时重新添加,我似乎无法找到满足这两个条件的解决方案。

到目前为止我试过了:

1) 网格布局 - 当 B 被隐藏时,D 保持原位。如果我将开始跟踪小部件 B 的隐藏显示状态,可以像我想要的那样对齐。

2) hbox 和 vbox 布局的组合 - D 将获得所有空间,在 B 被隐藏后,但当 B 显示时 - A 和 B 永远不会对齐。再一次,我需要重新排列所有小部件以实现我想要的行为。

我认为网格布局最适合我的目的,但是当我添加小部件时,行跨度是固定不变的。

有没有我想念的简单解决方案?

【问题讨论】:

  • QGridLayout + QWidget::setSizePolicy() 肯定能够解决这个(相当普通的)用例。如果您希望有人在这里指出您的问题,您应该显示您的代码:minimal reproducible example

标签: qt layout qt4 qt5


【解决方案1】:

你可以试试下面的代码:

#include <QMainWindow>
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
};

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setupUi(this);

    QWidget *left = new QWidget;
    QWidget *right = new QWidget;
    QHBoxLayout *hbox = new QHBoxLayout;
    QVBoxLayout *vboxLeft = new QVBoxLayout;
    QVBoxLayout *vboxRight = new QVBoxLayout;

    vboxLeft->addWidget(new QLabel("A"));
    vboxLeft->addWidget(new QLabel("C"));
    auto b = new QLabel("B");
    vboxRight->addWidget(b);
    vboxRight->addWidget(new QLabel("D"));

    left->setLayout(vboxLeft);
    right->setLayout(vboxRight);

    hbox->addWidget(left);
    hbox->addWidget(right);
    centralWidget()->setLayout(hbox);

    QAction *toggleB = new QAction("Toggle B");
    toggleB->setCheckable(true);
    connect(toggleB, &QAction::toggled, this, [=](bool toggled) {
        b->setHidden(toggled);
    });
    mainToolBar->addAction(toggleB);
}

您可以根据需要多次切换,它将保持布局整洁:

【讨论】:

  • 感谢您的回复,这种方法的问题是 A 和 B 没有真正对齐 - 如果 A 具有不同的高度,则 B - 小部件看起来不会对齐。 vboxLeft 在 A 和 C 之间拆分高度,vboxRight 对 B 和 D 执行相同操作。
  • 嗯,你的问题没有解释清楚。如果 A 与 B 的高度不同,那么将它们对齐意味着什么,这没有多大意义。因为您还需要同时将 A 与 C 对齐。
  • 是的,这就是我所说的网格布局最适合我的目的的意思。我需要将每一行和每一列调整为行/列中的最大宽度/高度。如果小部件被隐藏 - 将该列拉伸整个长度
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多