簡體   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