Entry widgets allow the user to enter text. You can change the contents with the set_text() method,
and read the current contents with the get_text() method.
Occasionally you might want to make an Entry widget
read-only. This can be done by passing false to the
set_editable() method.
For the input of passwords, passphrases and other information you don't want
echoed on the screen, calling set_visibility() with
false will cause the text to be hidden.
You might want to be notified whenever the user types in a text entry widget.
Gtk::Entry provides two signals,
activate and changed, for just this
purpose. activate is emitted when the user presses the
enter key in a text-entry widget; changed is emitted when
the text in the widget changes. You can use these, for instance, to validate
or filter the text the user types.
This example uses Gtk::Entry. It also has two
CheckButtons, with which you can toggle the editable and
visible flags.
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_checkbox_editable_toggled();
virtual void on_checkbox_visibility_toggled();
virtual void on_button_close();
//Child widgets:
Gtk::HBox m_HBox;
Gtk::VBox m_VBox;
Gtk::Entry m_Entry;
Gtk::Button m_Button_Close;
Gtk::CheckButton m_CheckButton_Editable, m_CheckButton_Visible;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
: m_Button_Close("Close"),
m_CheckButton_Editable("Editable"),
m_CheckButton_Visible("Visible")
{
set_size_request(200, 100);
set_title("Gtk::Entry");
add(m_VBox);
m_Entry.set_max_length(50);
m_Entry.set_text("hello");
m_Entry.set_text(m_Entry.get_text() + " world");
m_Entry.select_region(0, m_Entry.get_text_length());
m_VBox.pack_start(m_Entry);
// Note that add() can also be used instead of pack_xxx()
m_VBox.add(m_HBox);
m_HBox.pack_start(m_CheckButton_Editable);
m_CheckButton_Editable.signal_toggled().connect( sigc::mem_fun(*this,
&ExampleWindow::on_checkbox_editable_toggled) );
m_CheckButton_Editable.set_active(true);
m_HBox.pack_start(m_CheckButton_Visible);
m_CheckButton_Visible.signal_toggled().connect( sigc::mem_fun(*this,
&ExampleWindow::on_checkbox_visibility_toggled) );
m_CheckButton_Visible.set_active(true);
m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this,
&ExampleWindow::on_button_close) );
m_VBox.pack_start(m_Button_Close);
m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
m_Button_Close.grab_default();
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_checkbox_editable_toggled()
{
m_Entry.set_editable(m_CheckButton_Editable.get_active());
}
void ExampleWindow::on_checkbox_visibility_toggled()
{
m_Entry.set_visibility(m_CheckButton_Visible.get_active());
}
void ExampleWindow::on_button_close()
{
hide();
}
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;
}
A Entry widget can offer a drop-down list of
pre-existing choices based on the first few characters typed by the user. For
instance, a search dialog could suggest text from previous searches.
To enable this functionality, you must create a
EntryCompletion object, and provide it to the
Entry widget via the
set_completion() method.
The EntryCompletion may use a
TreeModel containing possible entries, specified with
set_model(). You should then call
set_text_column() to specify which of your model columns
should be used to match possible text entries.
Alternatively, if a complete list of possible entries
would be too large or too inconvenient to generate, a callback slot may instead
be specified with set_match_func(). That callback
function. This is also useful if you wish to match on a part of the string other
than the start.
This example creates a Gtk::EntryCompletion and associates
it with a Gtk::Entry widget. The completion uses a
Gtk::TreeModel of possible entries, and some additional
actions.
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_close();
virtual void on_completion_action_activated(int index);
//See the comment in the implementation:
//virtual bool on_completion_match(const Glib::ustring& key, const Gtk::TreeModel::const_iterator& iter);
//Tree model columns, for the EntryCompletion's filter model:
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
ModelColumns()
{ add(m_col_id); add(m_col_name); }
Gtk::TreeModelColumn<unsigned int> m_col_id;
Gtk::TreeModelColumn<Glib::ustring> m_col_name;
};
ModelColumns m_Columns;
typedef std::map<int, Glib::ustring> type_actions_map;
type_actions_map m_CompletionActions;
//Child widgets:
Gtk::HBox m_HBox;
Gtk::VBox m_VBox;
Gtk::Entry m_Entry;
Gtk::Label m_Label;
Gtk::Button m_Button_Close;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow() :
m_Label("Press a or b to see a list of possible completions and actions."),
m_Button_Close("Close")
{
//set_size_request(200, 100);
set_title("Gtk::EntryCompletion");
add(m_VBox);
m_VBox.pack_start(m_Entry, Gtk::PACK_SHRINK);
m_VBox.pack_start(m_Label, Gtk::PACK_EXPAND_WIDGET);
m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this,
&ExampleWindow::on_button_close) );
m_VBox.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
m_Button_Close.grab_default();
//Add an EntryCompletion:
Glib::RefPtr<Gtk::EntryCompletion> completion =
Gtk::EntryCompletion::create();
m_Entry.set_completion(completion);
//Create and fill the completion's filter model
Glib::RefPtr<Gtk::ListStore> refCompletionModel =
Gtk::ListStore::create(m_Columns);
completion->set_model(refCompletionModel);
// For more complex comparisons, use a filter match callback, like this.
// See the comment below for more details:
//completion->set_match_func( sigc::mem_fun(*this,
//&ExampleWindow::on_completion_match) );
//Fill the TreeView's model
Gtk::TreeModel::Row row = *(refCompletionModel->append());
row[m_Columns.m_col_id] = 1;
row[m_Columns.m_col_name] = "Alan Zebedee";
row = *(refCompletionModel->append());
row[m_Columns.m_col_id] = 2;
row[m_Columns.m_col_name] = "Adrian Boo";
row = *(refCompletionModel->append());
row[m_Columns.m_col_id] = 3;
row[m_Columns.m_col_name] = "Bob McRoberts";
row = *(refCompletionModel->append());
row[m_Columns.m_col_id] = 4;
row[m_Columns.m_col_name] = "Bob McBob";
//Tell the completion what model column to use to
//- look for a match (when we use the default matching, instead of
// set_match_func().
//- display text in the entry when a match is found.
completion->set_text_column(m_Columns.m_col_name);
//Add actions to the completion:
//These are just extra items shown at the bottom of the list of possible
//completions.
//Remember them for later.
m_CompletionActions[0] = "Use Wizard";
m_CompletionActions[1] = "Browse for Filename";
for(type_actions_map::iterator iter = m_CompletionActions.begin();
iter != m_CompletionActions.end(); ++iter)
{
int position = iter->first;
Glib::ustring title = iter->second;
completion->insert_action_text(title, position);
}
completion->signal_action_activated().connect( sigc::mem_fun(*this,
&ExampleWindow::on_completion_action_activated) );
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_button_close()
{
hide();
}
/* You can do more complex matching with a handler like this.
* For instance, you could check for substrings inside the string instead of the start,
* or you could look for the key in extra model columns as well as the model column that will be displayed.
* The code here is not actually more complex - it's a reimplementation of the default behaviour.
*
bool ExampleWindow::on_completion_match(const Glib::ustring& key, const
Gtk::TreeModel::const_iterator& iter)
{
if(iter)
{
Gtk::TreeModel::Row row = *iter;
Glib::ustring::size_type key_length = key.size();
Glib::ustring filter_string = row[m_Columns.m_col_name];
Glib::ustring filter_string_start = filter_string.substr(0, key_length);
//The key is lower-case, even if the user input is not.
filter_string_start = filter_string_start.lowercase();
if(key == filter_string_start)
return true; //A match was found.
}
return false; //No match.
}
*/
void ExampleWindow::on_completion_action_activated(int index)
{
type_actions_map::iterator iter = m_CompletionActions.find(index);
if(iter != m_CompletionActions.end()) //If it's in the map
{
Glib::ustring title = iter->second;
std::cout << "Action selected: " << title << std::endl;
}
}
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;
}
An Entry widget can show an icon at the start or
end of the text area. The icon can be specifed by methods such as
set_icon_from_pixbuf() or
set_icon_from_stock(). An application can respond to the
user pressing the icon by handling the
signal_icon_press signal.
This example shows a Gtk::Entry widget with a stock
search icon, and prints text to the terminal when the icon is pressed.
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:
void on_icon_pressed(Gtk::EntryIconPosition icon_pos, const GdkEventButton* event);
void on_button_close();
//Child widgets:
Gtk::VBox m_VBox;
Gtk::Entry m_Entry;
Gtk::Button m_Button_Close;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
: m_Button_Close("Close")
{
set_title("Gtk::Entry");
add(m_VBox);
m_Entry.set_max_length(50);
m_Entry.set_text("Hello world");
m_VBox.pack_start(m_Entry, Gtk::PACK_SHRINK);
m_Entry.set_icon_from_stock(Gtk::Stock::FIND);
m_Entry.signal_icon_press().connect( sigc::mem_fun(*this, &ExampleWindow::on_icon_pressed) );
m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this,
&ExampleWindow::on_button_close) );
m_VBox.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
m_Button_Close.grab_default();
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_icon_pressed(Gtk::EntryIconPosition /* icon_pos */, const GdkEventButton* /* event */)
{
std::cout << "Icon pressed." << std::endl;
}
void ExampleWindow::on_button_close()
{
hide();
}
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;
}
An Entry widget can show a progress bar inside the
text area, under the entered text. The progress bar will be shown if the
set_progress_fraction() or
set_progress_pulse_step() methods are called.
This example shows a Gtk::Entry widget with a progress
bar.
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:
bool on_timeout();
void on_button_close();
//Child widgets:
Gtk::VBox m_VBox;
Gtk::Entry m_Entry;
Gtk::Button m_Button_Close;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
: m_Button_Close("Close")
{
set_title("Gtk::Entry");
add(m_VBox);
m_Entry.set_max_length(50);
m_Entry.set_text("Hello world");
m_VBox.pack_start(m_Entry, Gtk::PACK_SHRINK);
//Change the progress fraction every 0.1 second:
Glib::signal_timeout().connect(
sigc::mem_fun(*this, &ExampleWindow::on_timeout),
100
);
m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this,
&ExampleWindow::on_button_close) );
m_VBox.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
m_Button_Close.grab_default();
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
bool ExampleWindow::on_timeout()
{
static double fraction = 0;
m_Entry.set_progress_fraction(fraction);
fraction += 0.01;
if(fraction > 1)
fraction = 0;
return true;
}
void ExampleWindow::on_button_close()
{
hide();
}
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;
}