在布局

时间:2017-01-24 18:00:32

标签: qt layout qt4 qt5

我想实现以下布局行为:

    | 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布局的组合 - 在隐藏B之后,D将获得所有空间,但是当显示B时 - A和B从不对齐。我再一次需要重新排列所有小部件以实现我想要的行为。

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

我错过了简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下代码:

#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);
}

您可以根据需要切换多次,这样可以保持布局清洁: toggle layout