[英]Qt QWidget::minimumSizeHint delay
我想用“扰流板”编写对话框。 当我显示/隐藏某些元素时,表单必须调整大小以匹配她的内容。 但是我注意到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不起作用?
考虑到只有在事件循环中处理了一些事件之后,才计算最小大小。 如果您不想使用计时器,一种解决方法是在按钮隐藏或显示后处理事件循环进行某些迭代,然后调整大小。
就像是 :
button3->setVisible(!button3->isVisible());
for(int i=0;i<10;i++)
qApp->processEvents();
adjust();
更好的解决方案是在调整大小之前调用QLayout::activate()
:
button3->setVisible(!button3->isVisible());
layout->activate();
adjust();
activate()
强制您的布局重新计算大小提示。
我尝试了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在慢速系统上可能还不够。 讨厌的解决方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.