gpt4 book ai didi

c++ - Qt - 从 QDialog 关闭程序(在 MainWindow 完全加载之前)

转载 作者:行者123 更新时间:2023-11-27 22:40:13 28 4
gpt4 key购买 nike

简介

嗨。在我的应用程序中,我在 MainWindow 的构造函数完成之前运行了一个 QDialog。根据此 QDialog 中的用户输入,我想关闭应用程序。

问题

我无法调用 qApp->quit()qApp->exit(int retcode = 0),因为 QApplication 事件循环尚未启动。有没有办法强制 MainWindow 退出?或者等到它完全加载后再退出?

解决方案?

我设法让它工作,但我不知道为什么。这是目前我的 QDialog 的 .cpp:

    QFileInfo checkConfig(configPath);
if(!checkConfig.exists() || !checkConfig.isFile())
{
qDebug() << "Sair!";
qApp->quit();
//qApp->exit(1);
//QTimer::singleShot(0, qApp, &QCoreApplication::quit);
QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection);
}

使用 QTimer::singleShot(0, qApp, &QCoreApplication::quit), QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection), qApp->quit()qApp->exit(1) 什么都不做。

但是,出于某种原因,使用(qApp->quit()qApp->exit(1))和(QTimer::singleShot( 0, qApp, &QCoreApplication::quit)QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection) ) 有效!

我觉得使用这个解决方案以后可能会回来咬我的屁股,因为我不知道它是如何工作的。有没有人有更好的解决方案或解释?

编辑

单独调用 QTimer::singleShot(0, qApp, &QCoreApplication::quit) 不会为我关闭应用程序。虽然,我第二次通过该功能时,它确实关闭了。 QTimer::singleShot() 是重新实现的QDialog::r​​eject 方法。并且,在关闭之前,我显示了一个 QMessageBox。这些都会干扰 QTimer 吗?

编辑2

我运行了示例@user3606329 展示。它确实有效。我更进一步,在这个程序中使用了另一个程序中的 QDialog。它确实不起作用。所以问题出在我的QDialog 中?下面是整个 reject 方法:

void Configuracao::reject()
{
QFileInfo checkConfig(configPath);
if(!checkConfig.exists() || !checkConfig.isFile())
{
QMessageBox::critical(this,"Erro na configuração","Erro na criação do aquivo config.ini.\n"
"O programa será finalizado!");
qDebug() << "Sair!";
//qApp->quit();
//qApp->exit(1);
QTimer::singleShot(0, qApp, &QCoreApplication::quit);
//QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection);
}
}

编辑 3

我决定创建另一个 QDialog 并且使用QTimer::singleShot 重新实现拒绝方法。它仍然没有用。第一次调用 reject 时,它经历了 QTimer::singleShot 并且什么也没做(甚至没有关闭对话框)。第二次,它关闭了对话框并关闭了应用程序。任何想法为什么? (下面的代码)

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialog.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
Dialog *conf;
};

#endif // MAINWINDOW_H

主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
conf = new Dialog(this);
conf->exec();
}

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

对话框.h:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
Q_OBJECT

public:
explicit Dialog(QWidget *parent = 0);
~Dialog();

private:
Ui::Dialog *ui;

protected:
void reject();
};

#endif // DIALOG_H

对话框.cpp:

#include "dialog.h"
#include "ui_dialog.h"
#include <QTimer>
#include <QDebug>

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);

}

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

void Dialog::reject()
{
QTimer::singleShot(0, qApp, []() {
qDebug() << "QTimer done";
QCoreApplication::quit();
});
}

主要.cpp:

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

qDebug() << "Event loop started";
return a.exec();
}

输出:

QTimer done //first click on "close window"
Event loop started //first click on "close window"
QTimer done //second click on "close window"

最佳答案

#include <QShowEvent>
#include <QDebug>
...
protected:
...
void showEvent(QShowEvent *event);
...
private:
...
bool init_check = false;
...


void MainWindow::showEvent(QShowEvent *event){
qDebug() << "QShowEvent" << init_check;

if(!init_check){
init_check = true;
bool err = true;
if(err){
qDebug() << "Closing app";
exit(EXIT_FAILURE);
}
}
}

关于c++ - Qt - 从 QDialog 关闭程序(在 MainWindow 完全加载之前),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49562236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com