Как закрыть приложение Qt из другой формы?

Рейтинг: 2Ответов: 1Опубликовано: 18.04.2015

пробовал свой сигнал создавать но не помогло. ниже немного кода:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QString>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::Dialog *ui;

signals:
    void Ok(QString name);
    void Exit();
private slots:
    void on_pushButtonOk_clicked();
    void on_pushButtonExit_clicked();
};

#endif // DIALOG_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <dialog.h>
#include <QString>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QLabel labelAll;
    QLabel labelRight;
    QLabel labelError;

    Dialog dialog; // вторая формочка

    QString name;

    char RigthReply;
    int TotalQuest;
    int CurrentQuest;
    int theRight;
    int theError;

    void TotalQuests();
    void GetQuest(int num);
private slots:
    void SetName(QString s);
    void on_pushButtonA_clicked();
    void on_pushButtonB_clicked();
    void on_pushButtonV_clicked();
    void on_pushButtonG_clicked();
    void on_action_3_triggered();
};

#endif // MAINWINDOW_H

связывание делаю в конструкторе основной формы: mainwindow.cpp

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

    QObject::connect(&dialog, SIGNAL(Ok(QString)), this, SLOT(SetName(QString)));
    QObject::connect(&dialog, SIGNAL(Exit()), this, SLOT(close()));

    dialog.exec();

........

сам сигнал Exit() генерирую в деструкторе второй формы

Ответы

▲ 3Принят
#include <QtCore/QCoreApplication>
...
QObject::connect(&dialog, SIGNAL(Exit()), qApp, SLOT(quit()));

Update: В общем случае не стоит вызывать диалог в конструкторе главной формы. Выделите для этого отдельный слот, который вызывайте через очередь:

QMetaObject::invokeMethod(this, "showMyDialog", Qt::QueuedConnection);

В слоте напишите просто что-то вроде такого:

void MainWindow::showMyDialog() {
   if(MyDialog(this).exec() == QDialog::Rejected)
      qApp->quit();
}

Вместо "QDialog::Rejected" можно использовать любой иной флаг по ситуации.

Если же Вам нужно, чтобы главное окно не показывалось до вывода диалога, то операцию вызова диалога перенесите в main.cpp или иной управляющий модуль.