Chapter 14. ダイアログ

Table of Contents

ダイアログは第二のウィンドウとして、特別な情報や質問を提供するために使われます。Gtk::Dialogウィンドウはそれぞれ、見た目の一貫性を保つために最初からパックされたウィジットをいくつか持っています。また、run()メソッドはユーザーがダイアログを消すまでブロックし続けます。

Dialogから派生した有用なクラスがいくつかあります。Gtk::MessageDialogはもっともシンプルな通知のために使われます。しかし、それ以外の場面では、もっと複雑な機能を持ったダイアログを派生したいと考えるかもしれません。

カスタムダイアログにウィジットを配置するには、Gtk::VBoxを使ったほうがいいでしょう。get_vbox()から利用可能です。単に、ButtonDialogに加えたいだけなら、add_button()メソッドが使えます。

run()メソッドはintを返します。これは標準のボタンで閉じたときに返るGtk::ResponseTypeの値です。または、add_button()を使って、カスタムした返り値を指定することもできます。

Reference

メッセージダイアログ

MessageDialogは有用なクラスです。これはシンプルな標準メッセージダイアログを、メッセージとアイコン、ユーザーが操作できるボタン付きで生成するときに使われます。コンストラクタの中でメッセージの種類とテキストを指定できます。Gtk::ButtonsType列挙型で標準ボタンの種類を指定するのも同様です。

Reference

Figure 14.1. MessageDialog

MessageDialog

Source Code

File: examplewindow.h

#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

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

protected:
  //Signal handlers:
  virtual void on_button_info_clicked();
  virtual void on_button_question_clicked();

  //Child widgets:
  Gtk::VButtonBox m_ButtonBox;
  Gtk::Button m_Button_Info, m_Button_Question;
};

#endif //GTKMM_EXAMPLEWINDOW_H

File: main.cc

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

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  //Shows the window and returns when it is closed.
  Gtk::Main::run(window);

  return 0;
}

File: examplewindow.cc

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


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

  add(m_ButtonBox);

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

  m_ButtonBox.pack_start(m_Button_Question);
  m_Button_Question.signal_clicked().connect(sigc::mem_fun(*this,
              &ExampleWindow::on_button_question_clicked) );

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_button_info_clicked()
{
  Gtk::MessageDialog dialog(*this, "This is an INFO MessageDialog");
  dialog.set_secondary_text(
          "And this is the secondary text that explains things.");

  dialog.run();
}

void ExampleWindow::on_button_question_clicked()
{
  Gtk::MessageDialog dialog(*this, "This is a QUESTION MessageDialog",
          false /* use_markup */, Gtk::MESSAGE_QUESTION,
          Gtk::BUTTONS_OK_CANCEL);
  dialog.set_secondary_text(
          "And this is the secondary text that explains things.");

  int result = dialog.run();

  //Handle the response:
  switch(result)
  {
    case(Gtk::RESPONSE_OK):
    {
      std::cout << "OK clicked." << std::endl;
      break;
    }
    case(Gtk::RESPONSE_CANCEL):
    {
      std::cout << "Cancel clicked." << std::endl;
      break;
    }
    default:
    {
      std::cout << "Unexpected button clicked." << std::endl;
      break;
    }
  }
}