在Qt中显示子窗口时暂停功能

时间:2012-07-21 14:00:07

标签: qt window show

在Qt Creator中我有一个主窗口和一个QWidget作为工具窗口(setWindowFlags(Qt :: tool))。当我调用工具窗口时,用户可以更改某些设置。然后,这些更改会改变主窗口中的一些数据。

我创建窗口小部件,显示它,然后我想更新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
}

感谢。

2 个答案:

答案 0 :(得分: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时更新。

答案 1 :(得分:0)

我这样做:

void userclicksonsettings() {
    settings = new Settings(this);
    settings->setWindowModality(Qt::ApplicationModal);
    settings->show();
   //...
}

Qt :: ApplicationModal- 该窗口是应用程序的模式窗口,并阻止所有窗口的输入。