3

QDockWidget単一の 内にいくつかの s (フローティングではなく、閉じることのみ可能) がありQWidgetます。それぞれの中にいくつかのウィジェットがありますQDockWidget-それらの高さは等しくなければなりません。これらの内部ウィジェットは、コンテキスト メニューから非表示にすることができます。

内部ウィジェットの高さは同じにする必要があります。私はこのようにしました:

void MyDocksPanel::redistributeSpace()
{
    QBoxLayout * lay = (QBoxLayout *)layout();
    for (int i = 0; i < lay->count(); i++)
    {
        QWidget * dock = lay->itemAt(i)->widget();
        if (dock == NULL)
            continue;

        int size = 0;
        foreach(QWidget * subWidget, dock->findChildren<QWidget*>())
            size += subWidget->isVisible() ? 1 : 0;

        if (dock->isVisible() && (size == 0))
            dock->hide();
        lay->setStretch(i, size);
    }
}

const 要素をそれぞれに追加するまで、すべて正常に機能しますQDockWidget。水平スクロールバーとラベルがいくつかあります...これで、内部ウィジェットのサイズが異なります。しかし、それらの高さを厳密に等しくする必要があります。

QLayoutウィジェットの階層の 1 つのレベルでウィジェットのサイズをレイアウトします。高さが等しいサブウィジェットを作成するにはどうすればよいですか?

3 つのサブウィジェットと 2 つのサブウィジェット

最初の写真

ストレッチ 3 と 2 を設定する最初の戦略:

ここに画像の説明を入力

しかし、スクロールバーを追加したとき:

ここに画像の説明を入力

私の 5 つのウィジェットの高さは 37,37,37,28,28 に等しい...そしてそれが問題です

4

2 に答える 2

4

ストレッチ ファクターは正しい方向に進んでいますが、小さな割合ではなく、ピクセル値の観点から考えてください。各ドック ウィジェットのストレッチ ファクターを次のように設定してみてください。

dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight;

ここでchildWidgetMinimumHeight、 とscrollBarHeightは両方ともピクセルで表され、両方とも定数です。

編集: これは実際の例です。プログラムで動作させるには、少し実験する必要があるかもしれませんが、これは良い出発点になるはずです。

header.h

#include <QtGui>

class WidgetWith3Children : public QWidget
{
public:
    WidgetWith3Children()
    {
        QTextEdit *edit1 = new QTextEdit;
        QTextEdit *edit2 = new QTextEdit;
        QTextEdit *edit3 = new QTextEdit;
        QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal);
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(edit1);
        layout->addWidget(edit2);
        layout->addWidget(edit3);
        layout->addWidget(scrollBar);
        setLayout(layout);
    }
};

class WidgetWith2Children : public QWidget
{
public:
    WidgetWith2Children()
    {
        QTextEdit *edit1 = new QTextEdit;
        QTextEdit *edit2 = new QTextEdit;
        QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal);
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(edit1);
        layout->addWidget(edit2);
        layout->addWidget(scrollBar);
        setLayout(layout);
    }
};

class OuterWidget : public QWidget
{
public:
    OuterWidget()
    {
        QDockWidget *dockWidget1 = new QDockWidget;
        QDockWidget *dockWidget2 = new QDockWidget;
        dockWidget1->setWidget(new WidgetWith3Children);
        dockWidget2->setWidget(new WidgetWith2Children);
        QVBoxLayout *layout = new QVBoxLayout;

        // 71 is the height of the minimum size hint for QTextEdit
        // 30 is the height of a horizontal scrollbar (on my system)
        layout->addWidget(dockWidget1, 71 * 3 + 30);
        layout->addWidget(dockWidget2, 71 * 2 + 30);

        layout->setMargin(0);
        setLayout(layout);
    }
};

main.cpp

#include <QtGui/QApplication>
#include "header.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OuterWidget w;
    w.show();

    return a.exec();
}
于 2012-04-23T17:47:09.983 に答える
1

私が理解していることを確認するためにQDockWidget、ラベルと水平スクロールバーだけでなく、複数の子を含む があります。ラベルとスクロールバーの高さは固定し、残りの垂直方向のスペースは子ウィジェット間で分割する必要があります。

それが正しければ、必要なことは、QVBoxLayouteach に a を追加することだけですQDockWidget。以下で行ったように、ウィジェットを追加します。

QDockWidget DockWidget;
QVBoxLayout Layout = new QVBoxLayout(DockWidget);

FixedHeightWidget.setFixedHeight(10)
Layout.addWidget(FixedHeightWidget, 0);
Layout.addWidget(FirstVariableHeightWidget, 1);
Layout.addWidget(SecondVariableHeightWidget, 1);
Layout.addWidget(ThirdVariableHeightWidget, 1);

レイアウトに追加したウィジェットのいずれかを非表示にする場合、レイアウトは残りの表示可能な子のサイズ変更を処理します。

于 2012-04-20T13:00:31.507 に答える