我正在尝试刷新QWidget
上的QMainWindow
,实际上我只是更改了QVBoxLayout
填充QGroupBoxs
因此,当某个信号被发出时,QMainWindow
会隐藏其布局中的所有QWidget
(在删除它们之前),然后创建新的show()
。QWidget
。问题是,90%的情况下,QWidget
的新列表更大。因此,当刷新完成后,新的QMainWindow
实际显示,但QMainWindow
处于旧的大小!简单的调整大小(使用鼠标)可以将QWidget
调整为适当的大小。
是否有任何功能适用于QMainWindow
?在它的布局?在{{1}}?
我在每个上面尝试过adjustSize(),但是没有效果
答案 0 :(得分:1)
这应该是自然而然的,所以你做错了什么。窗口小部件上布局的默认sizeConstraint
仅在窗口小部件太小时才会增长。您可以将其更改为增大和缩小窗口小部件。
您必须将新小部件添加到布局中。
您的主窗口不得有minimumSize()
。如果您从确实返回非零minimumSize()
的窗口小部件派生,则必须覆盖它并返回零大小。
您不必在delete
之前隐藏子窗口小部件。这是毫无意义。只需删除它们,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"