繁体   English   中英

Qt QWidget :: minimumSizeHint延迟

[英]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

这是我的代码: thisQMainWindow

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM