刷新布局需要调整大小?

时间:2012-06-15 08:36:06

标签: qt layout resize refresh qmainwindow

我正在尝试刷新QWidget上的QMainWindow,实际上我只是更改了QVBoxLayout填充QGroupBoxs

的布局

因此,当某个信号被发出时,QMainWindow会隐藏其布局中的所有QWidget(在删除它们之前),然后创建新的show()QWidget。问题是,90%的情况下,QWidget的新列表更大。因此,当刷新完成后,新的QMainWindow实际显示,但QMainWindow处于旧的大小!简单的调整大小(使用鼠标)可以将QWidget调整为适当的大小。

是否有任何功能适用于QMainWindow?在它的布局?在{{1}}?

我在每个上面尝试过adjustSize(),但是没有效果

1 个答案:

答案 0 :(得分:1)

这应该是自然而然的,所以你做错了什么。窗口小部件上布局的默认sizeConstraint仅在窗口小部件太小时才会增长。您可以将其更改为增大和缩小窗口小部件。

  1. 您必须将新小部件添加到布局中。

  2. 您的主窗口不得有minimumSize()。如果您从确实返回非零minimumSize()的窗口小部件派生,则必须覆盖它并返回零大小。

  3. 您不必在delete之前隐藏子窗口小部件。这是毫无意义。只需删除它们,Qt就可以正确处理它。

  4. 请参阅下面的完整示例。在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"