2017-01-24 14 views
0

のウィジェット配置:お互いには、私は、次のレイアウト動作を実現したいレイアウト

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

揃えA、B、C、DおよびBが非表示の場合Dは、利用可能なスペースを取ることができます。

レイアウトの動作1または2を複数の方法で実現できます。しかし、レイアウトからウィジェットを削除したり、Bがデフォルトのレイアウトで非表示にしたり再表示したりすることなく、これらの条件の両方を満たす解決策を見つけることができないようです。

私がこれまで試した:

1)グリッドレイアウトを - Bが隠されているとき、Dは所定の位置にとどまります。

2)hboxとvboxのレイアウトの組み合わせ - Bが隠されているが、Bが表示されているときに - Dはすべてのスペースを取得します。 - Aは、ウィジェットBの非表示状態を追跡し始めたい場合、とBは一直線に並ばない。もう一度、すべてのウィジェットを並べ替える必要があります。

グリッドレイアウトは私の目的に最も適していると思われますが、ウィジェットを追加すると行スパンが石で設定されます。

シンプルな解決方法がありますか?

+0

'QGridLayout' +' QWidgetの:: setSizePolicy( ) 'は、この(バニラではなく)ユースケースを確実に解決することができます。誰かがあなたの問題を指摘してくれると思うなら、コードを表示するべきです:[mcve]。 – Murphy

答えて

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

+0

あなたの返事に感謝します。このアプローチの問題は、AとBが本当に整列していないことです。Aの高さが違うとBウィジェットは整列して見えません。 'vboxLeft'はAとCの間の高さを分割し、' vboxRight'はBとDと同じです。 – Shf

+0

問題は明確に説明されていません。もし彼らが同じ高さでないならば、AをBと整列させることは意味がありますが、それはあまり意味がありません。同じ時間にAをCと整列させる必要もあるからです。 – MBach

+0

ええ、それは私の目的のためにグリッドレイアウトが最適であると言っていることです。行/列の最大幅/高さにリサイズするには、各行と列が必要です。ウィジェットが隠されている場合 - 列全体を伸ばす – Shf

関連する問題