我创建窗口小部件,显示它,然后我想更新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
}
感谢。
答案 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- 该窗口是应用程序的模式窗口,并阻止所有窗口的输入。