Käseknacker
Käseknacker

Reputation: 271

Closing Dialog quits Application if QMainWindow is hidden

I have the following Problem:

I have a Qt MainWindow which starts several Dialogs. Through an external source, I can hide and show the MainWindow. If a dialog is open, only the MainWindow is hidden, but the dialog is still visible. This is not nice but not my main problem. The main problem is, if i close the dialog while the MainWindow is hidden, the whole Application terminates. I do not want that, because I can make my main window visible again by external source.

I know it has something to do with QApplication quitOnLastWindowClosed. But if i set it true, my Application doesn't terminate if i normaly press "X".

Here is an example:

// MainApp.h
#include <QMainWindow>
#include "ui_MainWindow.h"

class MainApp : public QObject {
  Q_OBJECT
public:
  MainApp(QObject *parent = nullptr);
private slots:
  void slotOpenDialog();
private:
  QMainWindow mMainWindow;
  Ui::MainWindow mUi;
};

// MainApp.cpp
#include "MainApp.h"
#include <QTimer>
#include <QMessageBox>

MainApp::MainApp(QObject *parent) {
  mUi.setupUi(&mMainWindow);
  mMainWindow.show();

  connect(mUi.pushButton, &QPushButton::clicked, this, &MainApp::slotOpenDialog);

  // simulate external hide and show mechanism
  QTimer *timer = new QTimer(this);
  connect(timer, &QTimer::timeout,
          [=] {
            if(mMainWindow.isHidden()) mMainWindow.show();
            else mMainWindow.hide();
          });
  timer->start(3000);
}

void MainApp::slotOpenDialog() {
  QMessageBox::information(nullptr, "Info", "text");
}

// main.cpp
#include <QApplication>
#include "MainApp.h"

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);
  MainApp* mApp = new MainApp;
  // if set true, I can't exit the application with "X"
  //a.setQuitOnLastWindowClosed(false);
  int error = a.exec();
  delete mApp;
  return error;
}

How can I prevent the program from quitting when it is hidden and a still visible dialog has been closed and how can I make it exit normally when the window is visible?

Upvotes: 0

Views: 300

Answers (1)

Benjamin Bihler
Benjamin Bihler

Reputation: 2059

QApplication emits a signal "lastWindowClosed" and it has a quit() slot. As mentioned in the comments, the problem can be solved by connecting your own slot onLastWindowClosed() to that signal and quitting only when you want to.

Upvotes: 1

Related Questions