2015-04-03 91 views
1

我想用「擾流板」編寫對話框。當我顯示/隱藏某些元素時,表單必須調整大小以匹配她的內容。但我注意到minimumSizeHint有些延遲。比如我寫下面的對話框代碼:Qt QWidget :: 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()); 
} 

當按下按鈕1,形式不是她緊緊的內容相匹配,但是當按下按鈕2 ,表格與她的內容緊密匹配。 如何在沒有定時器和其他解決方法的情況下按下按鈕2來實現結果?爲什麼button1不起作用?

+1

你有定時器的內存泄漏。每次按下'button2'時,都會創建'QTimer'對象。所有的計時器都留在記憶中,直到你破壞對話。它可以通過下面的方式修復:'QTimer :: singleShot(0,this,&Dialog :: adjust);'。 'adjust'必須是一個插槽。我不明白你的lambdas的開銷。 – 2015-04-04 15:37:48

回答

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()力量佈局重新計算的尺寸暗示。

+0

這是另一種解決方法,它不是普通的解決方案。我們可以認爲這個問題是Qt bug嗎? – BiTOk 2015-04-04 06:36:46

+0

這是Qt中的一個正常行爲,並不是一個錯誤。我會建議使用計時器方法。我剛剛提到這種方式,因爲你想要另一種解決方法。 – Nejat 2015-04-04 06:54:14

+0

爲什麼在Qt doc中沒有指定這種行爲?你爲什麼認爲這是一種正常的行爲? – BiTOk 2015-04-04 07:06:39

-1

我試過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的可能不是一個緩慢的系統上是不夠的。討厭的解決方法。