2012-07-21 52 views
3

在Qt Creator中我有一個mainwindow和一個QWidget作爲工具窗口(setWindowFlags(Qt :: tool))。當我調用工具窗口時,用戶可以更改一些設置。這些更改會改變主窗口中的一些數據。當子窗口顯示在Qt中時暫停功能

我創建窗口小部件,顯示它,然後我想更新mainwindow中的數據,但該函數不會等待窗口小部件關閉。因此,演出後的更新程序將被亞馬遜執行並且不起作用。當我顯示一個QMessageBox時,函數等待用戶關閉它。

是否有一個標誌或我可以爲QWidget設置,以便函數等待?

void userclicksonsettings(){ 
settings = new Settings(this); // Settings is a QWidget-class with ui 
settings->show(); 
// function should wait till settings is closed 
// set up mainwindow with new values 
} 

謝謝。

回答

3

我剛解決了它。 使用QDialog而不是QWidget作爲基類允許調用窗口 QDialog :: exec(); 和父窗口小部件將暫停,直到窗口再次關閉。

編輯:這裏是我剛剛從備份磁盤中挖出的解決方案的來源。我不得不說,幾年前我最後使用Qt和這個代碼,所以它可能是不正確的。我希望這有助於理解。

settingsForm.h

#include <QDialog> 
class SettingsForm : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit SettingsForm(QWidget *parent = 0); 
    ~SettingsForm(); 
// other variables and slots etc. 
}; 

settingsForm.cpp

#include "settingsform.h" 
#include "ui_settingsForm.h" 

#include <QColorDialog> 

SettingsForm::SettingsForm(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::SettingsForm) 
{ 
    ui->setupUi(this); 
    this->setWindowFlags(Qt::Tool); 

// initializing functions 
} 

SettingsForm::~SettingsForm() 
{ 
    delete ui; 
} 

mainwindow.h

#include "settingsForm.h" 
// ... 

要調用settingsWindow從主窗口初始化對象並調用它像QDialog

mainwindow.cpp

settingsform = new SettingsForm(this); 
if(settingsform->exec() == QDialog::Accepted){ 
    // update form from settings 
} 

我也有一個設置類的可與形式,它傳遞給settingsForm,當用戶點擊OK更新設置的所有變量。