1

で を更新しようとしてQWidgetいますがQMainWindow、実際には でQVBoxLayout満たされたレイアウトを変更するだけですQGroupBoxs

そのため、特定のシグナルが発せられると、そのレイアウトに存在するQMainWindowすべての を非表示にしQWidgetて (削除する前に)、新しいものとshow()それらを作成します。問題は、90% の確率で、QWidgets の新しいリストの方が大きいということです。そのため、更新が完了すると、新しいQWidgetが実際に表示されますが、QMainWindowは古いサイズです! 簡単なサイズ変更 (マウスを使用) によりQMainWindow、適切なサイズにサイズ変更されます。

に適用する機能はありますQWidgetか? そのレイアウトに?上でQMainWindow

それぞれでadjustSize()を試しましたが、うまくいきませんでした

4

1 に答える 1

1

それは自然に機能するはずなので、何か間違ったことをしています。ウィジェットのレイアウトのデフォルトsizeConstraintでは、ウィジェットが小さすぎる場合にのみ拡大されます。ウィジェットを拡大および縮小するように変更できます。

  1. 新しいウィジェットをレイアウトに追加する必要があります。

  2. メイン ウィンドウにminimumSize(). ゼロ以外を返すウィジェットから派生する場合はminimumSize()、それをオーバーライドしてサイズ 0 を返す必要があります。

  3. delete子ウィジェットをing する前に非表示にする必要はありません。無意味です。それらを削除するだけで、Qtはそれを適切に処理します。

以下の完全な例を参照してください。OS X および Windows XP + MSVC でテスト済み。

//main.cpp
#include <cstdlib>
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
#include <QPushButton>

static int pick() { const int N = 10; return (qrand()/N) * N / (RAND_MAX/N); }

class Window : public QWidget {
    Q_OBJECT
    QLayout * layout;
public:
    Window() {
        layout = new QHBoxLayout;
        QPushButton * button;
        button = new QPushButton("Randomize", this);
        connect(button, SIGNAL(clicked()), SLOT(randomize()));
        layout->addWidget(button);
        button = new QPushButton("Grow", this);
        button->setCheckable(true);
        connect(button, SIGNAL(toggled(bool)), SLOT(grow(bool)));
        layout->addWidget(button);
        setLayout(layout);
    }
private slots:
    void randomize() {
        // remove old labels
        foreach (QObject * o, findChildren<QLabel*>()) { delete o; }
        // add some new labels
        int N = pick();
        while (N--) {
            layout->addWidget(new QLabel(QString(pick(), 'a' + pick()), this));
        }
    }
    void grow(bool shrink)
    {
        QPushButton * button = qobject_cast<QPushButton*>(sender());
        if (shrink) {
            button->setText("Grow && Shrink");
            layout->setSizeConstraint(QLayout::SetFixedSize);
        } else {
            button->setText("Grow");
            layout->setSizeConstraint(QLayout::SetDefaultConstraint);
        }
    }
};

int main(int c, char ** v)
{
    QApplication app(c,v);
    Window w;
    w.show();
    return app.exec();
}

#include "main.moc"
于 2012-06-16T05:56:27.287 に答える