<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ComboBoxEntry</title> <link rel="stylesheet" href="style.css" type="text/css"> <meta name="generator" content="DocBook XSL Stylesheets V1.73.2"> <link rel="start" href="index.html" title="Programming with gtkmm"> <link rel="up" href="ch09.html" title="Chapter 9. Combo Boxes"> <link rel="prev" href="ch09.html" title="Chapter 9. Combo Boxes"> <link rel="next" href="ch10.html" title="Chapter 10. TextView"> </head> <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> <div class="navheader"> <table width="100%" summary="Navigation header"> <tr><th colspan="3" align="center">ComboBoxEntry</th></tr> <tr> <td width="20%" align="left"> <a accesskey="p" href="ch09.html"><img src="../icons/prev.png" alt="Prev"></a> </td> <th width="60%" align="center">Chapter 9. Combo Boxes</th> <td width="20%" align="right"> <a accesskey="n" href="ch10.html"><img src="../icons/next.png" alt="Next"></a> </td> </tr> </table> <hr> </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> <a name="sec-comboboxentry"></a>ComboBoxEntry</h2></div></div></div> <p><a class="ulink" href="../../reference/html/classGtk_1_1ComboBoxEntry.html" target="_top">Reference</a></p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="sec-comboboxentry-text-column"></a>The text column</h3></div></div></div> <p>Unlike a regular <code class="classname">ComboBox</code>, a <code class="classname">ComboBoxEntry</code> contains a <code class="classname">Entry</code> widget for entering of arbitrary text. So that this Entry can interact with the drop-down list of choices, you must specify which of your model columns are the text column, with <code class="function">set_text_column()</code>. For instance: </p> <pre class="programlisting">m_combo.set_text_column(m_columns.m_col_name);</pre> <p> </p> <p> When you select a choice from the drop-down menu, the value from this column will be placed in the <code class="classname">Entry</code>. </p> </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="sec-comboboxentry-model"></a>The entry</h3></div></div></div> <p>Because the user may enter arbitrary text, an active model row isn't enough to tell us what text the user has inputted. Therefore, you should retrieve the <code class="classname">Entry</code> widget with the <code class="function">ComboBoxEntry::get_entry()</code> method and call <code class="function">get_text()</code> on that. </p> </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="id2581277"></a>Full Example</h3></div></div></div> <div class="figure"> <a name="figure-comboboxentry_complex"></a><p class="title"><b>Figure 9.3. ComboBoxEntry</b></p> <div class="figure-contents"><div class="screenshot"><div><img src="../figures/comboboxentry_complex.png" alt="ComboBoxEntry"></div></div></div> </div> <br class="figure-break"><p><a class="ulink" href="../../../examples/book/comboboxentry/complex" target="_top">Source Code</a></p> <p>File: <code class="filename">examplewindow.h</code> </p> <pre class="programlisting"> #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 </pre> <p>File: <code class="filename">main.cc</code> </p> <pre class="programlisting"> #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; } </pre> <p>File: <code class="filename">examplewindow.cc</code> </p> <pre class="programlisting"> #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; } } </pre> </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="id2581462"></a>Simple Text Example</h3></div></div></div> <div class="figure"> <a name="figure-comboboxentry_text"></a><p class="title"><b>Figure 9.4. ComboBoxEntryText</b></p> <div class="figure-contents"><div class="screenshot"><div><img src="../figures/comboboxentry_text.png" alt="ComboBoxEntryText"></div></div></div> </div> <br class="figure-break"><p><a class="ulink" href="../../../examples/book/comboboxentry/text" target="_top">Source Code</a></p> <p>File: <code class="filename">examplewindow.h</code> </p> <pre class="programlisting"> #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 </pre> <p>File: <code class="filename">main.cc</code> </p> <pre class="programlisting"> #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; } </pre> <p>File: <code class="filename">examplewindow.cc</code> </p> <pre class="programlisting"> #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; } </pre> </div> </div> <div class="navfooter"> <hr> <table width="100%" summary="Navigation footer"> <tr> <td width="40%" align="left"> <a accesskey="p" href="ch09.html"><img src="../icons/prev.png" alt="Prev"></a> </td> <td width="20%" align="center"><a accesskey="u" href="ch09.html"><img src="../icons/up.png" alt="Up"></a></td> <td width="40%" align="right"> <a accesskey="n" href="ch10.html"><img src="../icons/next.png" alt="Next"></a> </td> </tr> <tr> <td width="40%" align="left" valign="top">Chapter 9. Combo Boxes </td> <td width="20%" align="center"><a accesskey="h" href="index.html"><img src="../icons/home.png" alt="Home"></a></td> <td width="40%" align="right" valign="top"> Chapter 10. TextView</td> </tr> </table> </div> </body> </html>