通常のComboBoxと違って、ComboBoxEntryはEntryウィジットを持ち任意のテキストを入力できます。このエントリをドロップダウンリストの選択に反応するようにするにはどのモデル列がテキスト列であるかset_text_column()で指定してください。例えば:
m_combo.set_text_column(m_columns.m_col_name);
ドロップダウンメニューから選択すると、その列の値はEntryに配置されます。
ユーザーは任意のテキストを入力できますから、アクティブなモデル行を見るのではユーザーが何を入力したのか知ることはできません。ですから、ComboBoxEntry::get_entry()メソッドでEntryウィジットを取得し、そこでget_text()を呼んでください。
File: examplewindow.h
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm/window.h>
#include <gtkmm/comboboxentrytext.h>
#include <gtkmm/liststore.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//Signal handlers:
virtual void on_combo_changed();
//Tree model columns:
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
ModelColumns()
{ add(m_col_id); add(m_col_name); }
Gtk::TreeModelColumn<Glib::ustring> m_col_id; //The data to choose - this must be text.
Gtk::TreeModelColumn<Glib::ustring> m_col_name;
};
ModelColumns m_Columns;
//Child widgets:
Gtk::ComboBoxEntry m_Combo;
Glib::RefPtr<Gtk::ListStore> m_refTreeModel;
};
#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/stock.h>
#include <iostream>
ExampleWindow::ExampleWindow()
{
set_title("ComboBoxEntry example");
//Create the Tree model:
//m_refTreeModel = Gtk::TreeStore::create(m_Columns);
m_refTreeModel = Gtk::ListStore::create(m_Columns);
m_Combo.set_model(m_refTreeModel);
//Fill the ComboBox's Tree Model:
Gtk::TreeModel::Row row = *(m_refTreeModel->append());
row[m_Columns.m_col_id] = "1";
row[m_Columns.m_col_name] = "Billy Bob";
/*
Gtk::TreeModel::Row childrow = *(m_refTreeModel->append(row.children()));
childrow[m_Columns.m_col_id] = 11;
childrow[m_Columns.m_col_name] = "Billy Bob Junior";
childrow = *(m_refTreeModel->append(row.children()));
childrow[m_Columns.m_col_id] = 12;
childrow[m_Columns.m_col_name] = "Sue Bob";
*/
row = *(m_refTreeModel->append());
row[m_Columns.m_col_id] = "2";
row[m_Columns.m_col_name] = "Joey Jojo";
row = *(m_refTreeModel->append());
row[m_Columns.m_col_id] = "3";
row[m_Columns.m_col_name] = "Rob McRoberts";
/*
childrow = *(m_refTreeModel->append(row.children()));
childrow[m_Columns.m_col_id] = 31;
childrow[m_Columns.m_col_name] = "Xavier McRoberts";
*/
//Add the model columns to the Combo (which is a kind of view),
//rendering them in the default way:
//This is automatically rendered when we use set_text_column().
//m_Combo.pack_start(m_Columns.m_col_id);
m_Combo.pack_start(m_Columns.m_col_name);
m_Combo.set_text_column(m_Columns.m_col_id);
//Add the ComboBox to the window.
add(m_Combo);
//Connect signal handler:
m_Combo.signal_changed().connect(sigc::mem_fun(*this,
&ExampleWindow::on_combo_changed) );
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_combo_changed()
{
Gtk::Entry* entry = m_Combo.get_entry();
//Note: to get changes only when the entry has been completed,
//instead of on every key press, connect to Entry::signal_changed()
//instead of ComboBoxEntry::signal_changed.
if(entry)
{
std::cout << " ID=" << entry->get_text() << std::endl;
}
}
File: examplewindow.h
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm/window.h>
#include <gtkmm/comboboxentrytext.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//Signal handlers:
virtual void on_combo_changed();
//Child widgets:
Gtk::ComboBoxEntryText m_Combo;
};
#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/stock.h>
#include <iostream>
ExampleWindow::ExampleWindow()
{
set_title("ComboBoxEntryText example");
//Fill the combo:
m_Combo.append_text("something");
m_Combo.append_text("something else");
m_Combo.append_text("something or other");
add(m_Combo);
//Connect signal handler:
m_Combo.signal_changed().connect(sigc::mem_fun(*this,
&ExampleWindow::on_combo_changed) );
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_combo_changed()
{
Glib::ustring text = m_Combo.get_active_text();
if(!(text.empty()))
std::cout << "Combo changed: " << text << std::endl;
}