Chapter 15. Dialogs

Table of Contents

Dialogs are used as secondary windows, to provide specific information or to ask questions. Gtk::Dialog windows contain a few pre-packed widgets to ensure consistency, and a response signal which is emitted when the user dismisses the dialog.

There are several derived Dialog classes which you might find useful. Gtk::MessageDialog is used for most simple notifications. But at other times you might need to derive your own dialog class to provide more complex functionality.

To pack widgets into a custom dialog, you should pack them into the Gtk::Box, available via get_content_area(). To just add a Button to the bottom of the Dialog, you could use the add_button() method.

The response signal handler receives an int. This may be a value from the Gtk::ResponseType if the user closed the dialog by clicking a standard button, or it could be the custom response value that you specified when using add_button().

To show the dialog, call set_visible(true). If the same dialog instance will be shown several times, you must also call set_hide_on_close(), or else the dialog will be destroyed when it's closed. Connect to the response signal, if you want to know which button was pressed. The response signal handler is also where you should hide the dialog.

Reference

MessageDialog

MessageDialog is a convenience class, used to create simple, standard message dialogs, with a message and buttons for user response. You can specify the type of message and the text in the constructor, as well as specifying standard buttons via the Gtk::ButtonsType enum.

Reference

Example

Figure 15.1. MessageDialog

MessageDialog

Source Code

File: examplewindow.h (For use with gtkmm 4)

#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>
#include <memory>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //Signal handlers:
  void on_button_info_clicked();
  void on_button_question_clicked();
  void on_question_dialog_response(int response_id);

  //Child widgets:
  Gtk::Box m_ButtonBox;
  Gtk::Button m_Button_Info, m_Button_Question;

  std::unique_ptr<Gtk::MessageDialog> m_pDialog;
};

#endif //GTKMM_EXAMPLEWINDOW_H

File: examplewindow.cc (For use with gtkmm 4)

#include "examplewindow.h"
#include <gtkmm/messagedialog.h>
#include <iostream>


ExampleWindow::ExampleWindow()
: m_ButtonBox(Gtk::Orientation::VERTICAL),
  m_Button_Info("Show Info MessageDialog"),
  m_Button_Question("Show Question MessageDialog")
{
  set_title("Gtk::MessageDialog example");

  set_child(m_ButtonBox);

  m_ButtonBox.append(m_Button_Info);
  m_Button_Info.set_expand(true);
  m_Button_Info.signal_clicked().connect(sigc::mem_fun(*this,
              &ExampleWindow::on_button_info_clicked) );

  m_ButtonBox.append(m_Button_Question);
  m_Button_Question.set_expand(true);
  m_Button_Question.signal_clicked().connect(sigc::mem_fun(*this,
              &ExampleWindow::on_button_question_clicked) );
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_button_info_clicked()
{
  m_pDialog = std::make_unique<Gtk::MessageDialog>(*this, "This is an INFO MessageDialog");
  m_pDialog->set_secondary_text(
          "And this is the secondary text that explains things.");
  m_pDialog->set_modal(true);
  m_pDialog->set_hide_on_close(true);
  m_pDialog->signal_response().connect(
    [this](int /* response_id */){ m_pDialog->set_visible(false); });

  m_pDialog->set_visible(true);
}

void ExampleWindow::on_button_question_clicked()
{
  m_pDialog = std::make_unique<Gtk::MessageDialog>(*this, "This is a QUESTION MessageDialog",
          false /* use_markup */, Gtk::MessageType::QUESTION,
          Gtk::ButtonsType::OK_CANCEL, true /* modal */);
  m_pDialog->set_secondary_text(
          "And this is the secondary text that explains things.");
  m_pDialog->set_hide_on_close(true);
  m_pDialog->signal_response().connect(
    sigc::mem_fun(*this, &ExampleWindow::on_question_dialog_response));

  m_pDialog->set_visible(true);
}

void ExampleWindow::on_question_dialog_response(int response_id)
{
  m_pDialog->set_visible(false);

  //Handle the response:
  switch (response_id)
  {
    case Gtk::ResponseType::OK:
    {
      std::cout << "OK clicked." << std::endl;
      break;
    }
    case Gtk::ResponseType::CANCEL:
    {
      std::cout << "Cancel clicked." << std::endl;
      break;
    }
    case Gtk::ResponseType::DELETE_EVENT:
    {
      std::cout << "Dialog closed." << std::endl;
      break;
    }
    default:
    {
      std::cout << "Unexpected button clicked: " << response_id << std::endl;
      break;
    }
  }
}

File: main.cc (For use with gtkmm 4)

#include "examplewindow.h"
#include <gtkmm/application.h>

int main(int argc, char *argv[])
{
  auto app = Gtk::Application::create("org.gtkmm.example");

  //Shows the window and returns when it is closed.
  return app->make_window_and_run<ExampleWindow>(argc, argv);
}