Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) Answer of exercise: Qt hide and show #3

 

Answer of exercise: Qt hide and show #3 is the answer of the exercise Qt hide and show #3.

 

 

 

 

 

Solution

 

 

 

 

 

 

 

Qt project file: CppExerciseQtHideAndShow3Answer.pro

 

QT       += core gui
TARGET = CppExerciseQtHideAndShow3Answer
TEMPLATE = app
SOURCES += \
    main.cpp\
    firstdialog.cpp \
    seconddialog.cpp \
    thirddialog.cpp \
    qthideandshowdialog.cpp

HEADERS  +=  \
    firstdialog.h \
    seconddialog.h \
    thirddialog.h \
    qthideandshowdialog.h

FORMS    += \
    firstdialog.ui \
    seconddialog.ui \
    thirddialog.ui

 

 

 

 

 

firstdialog.h

 

#ifndef FIRSTDIALOG_H
#define FIRSTDIALOG_H

#include "qthideandshowdialog.h"

namespace Ui {
class FirstDialog;
}

class FirstDialog : public QtHideAndShowDialog
{
  Q_OBJECT
    
public:
  explicit FirstDialog(QWidget *parent = 0);
  ~FirstDialog();
    
private slots:
  void on_pushButton_clicked();

private:
  Ui::FirstDialog *ui;
};

#endif // FIRSTDIALOG_H

 

 

 

 

 

firstdialog.cpp

 

#include "seconddialog.h"
#include "firstdialog.h"
#include "ui_firstdialog.h"

FirstDialog::FirstDialog(QWidget *parent) :
    QtHideAndShowDialog(parent),
    ui(new Ui::FirstDialog)
{
  ui->setupUi(this);
}

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

void FirstDialog::on_pushButton_clicked()
{
  SecondDialog d;
  this->ShowChild(&d);
}

 

 

 

 

 

main.cpp

 

#include <QtGui/QApplication>
#include "firstdialog.h"

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

 

 

 

 

 

qthideandshowdialog.h

 

#ifndef QTHIDEANDSHOWDIALOG_H
#define QTHIDEANDSHOWDIALOG_H

#include <QDialog>

class QtHideAndShowDialog : public QDialog
{
    Q_OBJECT
    
public:
  explicit QtHideAndShowDialog(QWidget *parent = 0);

  ///Virtual destructor as this is a base class
  virtual ~QtHideAndShowDialog() {}

  ///Show a child
  void ShowChild(QtHideAndShowDialog * const dialog);

protected:
  ///Shows a child until it emits a close_me signal
  bool m_show_child;

  ///closeEvent that emits the close_me signal
  void closeEvent(QCloseEvent *);

signals:
  ///Emit the closeEvent of this dialog
  void close_me();

protected slots:
  ///Slot that needs to be called when a child signals close_me
  void close_child();

};

#endif // QTHIDEANDSHOWDIALOG_H

 

 

 

 

 

qthideandshowdialog.cpp

 

#include <cassert>
#include "qthideandshowdialog.h"

QtHideAndShowDialog::QtHideAndShowDialog(QWidget *parent)
  : QDialog(parent),
    m_show_child(false)
{

}

void QtHideAndShowDialog::close_child()
{
  m_show_child = false;
}

void QtHideAndShowDialog::closeEvent(QCloseEvent *)
{
  emit close_me();
}


void QtHideAndShowDialog::ShowChild(QtHideAndShowDialog * const dialog)
{
  assert(dialog);
  this->hide();
  QObject::connect(dialog,SIGNAL(close_me()),this,SLOT(close_child()));
  m_show_child = true;
  while (m_show_child)
  {
    dialog->exec();
  }
  this->show();
}

 

 

 

 

 

seconddialog.h

 

#ifndef SECONDDIALOG_H
#define SECONDDIALOG_H

#include "qthideandshowdialog.h"

namespace Ui {
class SecondDialog;
}

class SecondDialog : public QtHideAndShowDialog
{
    Q_OBJECT
    
public:
  explicit SecondDialog(QWidget *parent = 0);
  ~SecondDialog();
    
private slots:
  void on_button_goto_third_clicked();

  void on_button_back_to_first_clicked();

private:
  Ui::SecondDialog *ui;
};

#endif // SECONDDIALOG_H

 

 

 

 

 

seconddialog.cpp

 

#include <cassert>
#include "seconddialog.h"
#include "ui_seconddialog.h"
#include "thirddialog.h"

SecondDialog::SecondDialog(QWidget *parent) :
    QtHideAndShowDialog(parent),
    ui(new Ui::SecondDialog)
{
  ui->setupUi(this);
}

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

void SecondDialog::on_button_back_to_first_clicked()
{
  close();
}

void SecondDialog::on_button_goto_third_clicked()
{
  ThirdDialog d;
  this->ShowChild(&d);
  if (d.m_back_to_which_dialog == 1)
  {
    this->close();
  }
}

 

 

 

 

 

thirddialog.h

 

#ifndef THIRDDIALOG_H
#define THIRDDIALOG_H

#include "qthideandshowdialog.h"

namespace Ui {
class ThirdDialog;
}

class ThirdDialog : public QtHideAndShowDialog
{
    Q_OBJECT

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

    int m_back_to_which_dialog;

private slots:
    void on_button_back_to_first_clicked();

    void on_button_back_to_second_clicked();

private:
    Ui::ThirdDialog *ui;
};

#endif // THIRDDIALOG_H

 

 

 

 

 

thirddialog.cpp

 

#include "thirddialog.h"
#include "ui_thirddialog.h"

ThirdDialog::ThirdDialog(QWidget *parent) :
    QtHideAndShowDialog(parent),
    m_back_to_which_dialog(2), //When user closes the dialog, go back to the previous/second dialog
    ui(new Ui::ThirdDialog)
{
  ui->setupUi(this);
}

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

void ThirdDialog::on_button_back_to_first_clicked()
{
  m_back_to_which_dialog = 1;
  close();
}

void ThirdDialog::on_button_back_to_second_clicked()
{
  m_back_to_which_dialog = 2;
  close();
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict

This page has been created by the tool CodeToHtml