Go back to Richel Bilderbeek's homepage.

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

 

 

 

 

 

(C++) QtExample30

 

QtQt CreatorLubuntu

 

Qt example 30: controlling program flow with a Singleton is a Qt Example that uses Singleton to produce dialogs until it is told to quit.

Technical facts

 

Application type(s)

Operating system(s) or programming environment(s)

IDE(s):

Project type:

C++ standard:

Compiler(s):

Libraries used:

 

 

 

 

 

Qt project file: ./CppQtExample30/CppQtExample30.pro

 

exists(../../DesktopApplication.pri) {
  include(../../DesktopApplication.pri)
}
!exists(../../DesktopApplication.pri) {
  QT += core gui
  greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  TEMPLATE = app

  CONFIG(debug, debug|release) {
    message(Debug mode)
  }

  CONFIG(release, debug|release) {
    message(Release mode)
    DEFINES += NDEBUG NTRACE_BILDERBIKKEL
  }

  QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra

  unix {
    QMAKE_CXXFLAGS += -Werror
  }
}

exists(../../Libraries/Boost.pri) {
  include(../../Libraries/Boost.pri)
}
!exists(../../Libraries/Boost.pri) {
  win32 {
    INCLUDEPATH += \
      ../../../Projects/Libraries/boost_1_55_0
  }
}

SOURCES += \
    main.cpp \
    firstdialog.cpp \
    seconddialog.cpp \
    commander.cpp
HEADERS  += \
    firstdialog.h \
    seconddialog.h \
    commander.h
FORMS    += \
    firstdialog.ui \
    seconddialog.ui

 

 

 

 

 

./CppQtExample30/commander.h

 

#ifndef COMMANDER_H
#define COMMANDER_H

///Commander is a Singleton for managing program flow
struct Commander
{
  ///Get the Commander's only instance
  static Commander * GetInstance();

  ///Start the program
  void Run();

  ///Child asks to quit the program
  void Quit();

  private:
  ///A Singleton's constructor is private
  Commander();

  ///The one and only Commander instance
  static Commander * m_instance;

  ///Flag the tell whether to quit
  bool m_quit;
};

#endif // COMMANDER_H

 

 

 

 

 

./CppQtExample30/commander.cpp

 

#include "commander.h"

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <boost/shared_ptr.hpp>
#include "firstdialog.h"
#include "seconddialog.h"
#pragma GCC diagnostic pop

Commander * Commander::m_instance = 0;

Commander::Commander()
  : m_quit(false)
{

}

Commander * Commander::GetInstance()
{
  if (!m_instance) m_instance = new Commander;
  return m_instance;
}

void Commander::Quit()
{
  m_quit = true;
}

void Commander::Run()
{
  while (!m_quit)
  {
    boost::shared_ptr<QDialog> dialog(
      ((std::rand() >> 4) % 2)
      ? dynamic_cast<QDialog*>(new FirstDialog)
      : dynamic_cast<QDialog*>(new SecondDialog));
    dialog->exec();
  }
}

 

 

 

 

 

./CppQtExample30/firstdialog.h

 

#ifndef FIRSTDIALOG_H
#define FIRSTDIALOG_H

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QDialog>
#pragma GCC diagnostic pop

namespace Ui {
  class FirstDialog;
}

class FirstDialog : public QDialog
{
  Q_OBJECT
    
public:
  explicit FirstDialog(QWidget *parent = 0);
  FirstDialog(const FirstDialog&) = delete;
  FirstDialog& operator=(const FirstDialog&) = delete;
  ~FirstDialog();
    
private:
  Ui::FirstDialog *ui;
};

#endif // FIRSTDIALOG_H

 

 

 

 

 

./CppQtExample30/firstdialog.cpp

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include "firstdialog.h"
#include "ui_firstdialog.h"
#pragma GCC diagnostic pop

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

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

 

 

 

 

 

./CppQtExample30/main.cpp

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include "commander.h"
#include <QApplication>
#pragma GCC diagnostic pop

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  Commander::GetInstance()->Run();
  return 0;
}

 

 

 

 

 

./CppQtExample30/seconddialog.h

 

#ifndef SECONDDIALOG_H
#define SECONDDIALOG_H

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QDialog>
#pragma GCC diagnostic pop

namespace Ui {
  class SecondDialog;
}

class SecondDialog : public QDialog
{
  Q_OBJECT
    
public:
  explicit SecondDialog(QWidget *parent = 0);
  SecondDialog(const SecondDialog&) = delete;
  SecondDialog& operator=(const SecondDialog&) = delete;
  ~SecondDialog() noexcept;
    
private slots:
  void on_pushButton_clicked();

private:
  Ui::SecondDialog *ui;
};

#endif // SECONDDIALOG_H

 

 

 

 

 

./CppQtExample30/seconddialog.cpp

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include "seconddialog.h"
#include "ui_seconddialog.h"
#include "commander.h"
#pragma GCC diagnostic pop

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

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

void SecondDialog::on_pushButton_clicked()
{
  Commander::GetInstance()->Quit();
  this->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