我想用“剧透”编写对话框。当我显示/隐藏某些元素时,表单必须调整大小以匹配她的内容。但我注意到minimumSizeHint有一些延迟。例如,我写了以下对话框代码:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
class Dialog : public QDialog {
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
private:
QPushButton *button1, *button2, *button3;
void adjust();
};
#endif // DIALOG_H
dialog.cpp
#include <QVBoxLayout>
#include <QPushButton>
#include <QTimer>
#include "dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent) {
QVBoxLayout *layout = new QVBoxLayout;
button1 = new QPushButton("bad method", this);
button2 = new QPushButton("working method", this);
button3 = new QPushButton("indent", this);
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
setLayout(layout);
connect(button1, &QPushButton::pressed, [=]() {
button3->setVisible(!button3->isVisible());
adjust();
});
connect(button2, &QPushButton::pressed, [=]() {
button3->setVisible(!button3->isVisible());
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [=](){ adjust(); });
timer->setSingleShot(true);
timer->start(0);
});
}
void Dialog::adjust() {
resize(width(), minimumSizeHint().height());
}
当按下button1时,表单与她的内容不匹配,但是当按下button2时,表单与她的内容紧密匹配。 如何在没有定时器和其他变通方法的情况下按下button2即可获得结果?为什么button1不起作用?
答案 0 :(得分:1)
考虑在事件循环中处理某些事件之前不会计算最小大小。如果您不想使用计时器,一种解决方法是在隐藏按钮或使按钮可见之后处理事件循环一些迭代,然后调整大小。
就像:
button3->setVisible(!button3->isVisible());
for(int i=0;i<10;i++)
qApp->processEvents();
adjust();
更好的解决方案是在调整大小之前调用QLayout::activate()
:
button3->setVisible(!button3->isVisible());
layout->activate();
adjust();
activate()
强制您的布局重新计算大小提示。
答案 1 :(得分:-1)
我尝试了QLayout::activate()
解决方案,但它对我不起作用。
QLayout::activate()
返回false
。
这是我的代码:this
是QMainWindow
。
ui.groupBox->setVisible(!ui.groupBox->isVisible());
qDebug() << this->layout()->activate();
qDebug() << this->minimumSizeHint();
this->resize(this->minimumSizeHint());
任何想法为什么它不起作用?
我目前的解决方法是:
QTimer::singleShot(10, this, SLOT(on_resizeMin()));
但是我注意到在慢速系统上10ms可能还不够。讨厌的解决方法。