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

3
在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个回答

3
我刚刚解决了这个问题。 将QDialog用作基类可允许使用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"
// ...

要从mainwindow中调用settingsWindow,需要初始化对象并像QDialog一样调用它。

mainwindow.cpp

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

我还有一个设置类,用于存储可以通过表单设置的所有变量,该类被传递给settingsForm并在用户单击“确定”时进行更新。


0
我是这样做的:
void userclicksonsettings() {
    settings = new Settings(this);
    settings->setWindowModality(Qt::ApplicationModal);
    settings->show();
   //...
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接