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.
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.
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); }