Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Виджеты кнопок
Оригинал: Programming with gtkmm 3
Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Перевод: А.Панин
5. Виджеты кнопок
- Обычные кнопки (Push-Buttons)
- Представлены классом Gtk::Button, стандартные кнопки, обычно снабженные надписью или картинкой. Нажатие приводит к выполнению действия. Подробнее в разделе "Кнопка (Button)".
- Кнопки-переключатели (Toggle buttons)
- Представлены классом Gtk::ToggleButton. В отличие от обычной кнопки, кнопка-переключатель остается в нажатом состоянии до того момента, пока вы снова не нажмете на нее. Данные кнопки могут быть полезны для реализации переключателя состояний включено/выключено. Подробнее в разделе "Кнопка-переключатель (ToggleButton)".
- Флажки (Checkboxes)
- Представлены классом Gtk::CheckButton. Ведут себя точно так же, как и кнопки-переключатели, но отображают свое состояние с помощью небольших квадратов, снабженных расположенными сбоку строками описания. Их следует использовать в большинстве случаев, когда требуется осуществить переключение состояния включено/выключено. Подробнее в разделе "Флажок (CheckBox)".
- Радио-кнопки (Radio Buttons)
- Представлены классом Gtk::RadioButton. Названные ввиду схожести с переключателями станций в старых автомагнитолах, эти кнопки используются в составе групп для выбора взаимоисключающих параметров. Нажатие на одну из кнопок приводит к отключению всех остальных кнопок группы. Они аналогичны флажкам (небольшим виджетам со строкой описания сбоку), но выглядят по-другому. Подробнее в разделе "Радио-кнопка (RadioButton)".
Следует учесть, что из-за использования системы тем GTK+ внешний вид описанных виджетов может быть различным. В случае флажков и радио-кнопок различия могут быть значительными.
5.1. Кнопка (Button)
5.1.1. Конструкторы
Существует два способа создания кнопки. Вы можете указать строку для надписи на кнопке при использовании конструктора класса Gtk::Button
или установить эту строку позднее с помощью метода set_label()
.
true
в качестве значения дополнительного аргумента mnemonic
, регламентирующего использование мнемоник. Например:
Gtk::Button* pButton = new Gtk::Button("_Something", true);
Gtk::Button* pButton = new Gtk::Button(Gtk::Stock::OK);
Для данной кнопки будет использоваться стандартный текст надписи на всех языках, а так же стандартные клавиатурные акселераторы и стандартная иконка.
Виджет, представленный классом Gtk::Button
также является контейнерным, поэтому вы можете помещать в него любой другой виджет, такой, как представленный классом Gtk::Image
виджет для вывода картинки.
5.1.2. Пример
Данный пример позволяет создать кнопку с иконкой и надписью.
Рисунок 5-1: Пример использования кнопок
Файл buttons.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл buttons.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
5.1.3. Сигналы
Gtk::Button
, генерирует приведенные ниже сигналы, но в большинстве случаев вам придется обрабатывать исключительно сигнал "clicked"
:
- pressed
- Генерируется в момент нажатия кнопки.
- released
- Генерируется в момент отпускания кнопки.
- clicked
- Генерируется после того, как кнопка нажата и отпущена.
- enter
- Генерируется в момент, когда указатель мыши перемещается над окном кнопки.
- leave
- Генерируется в момент, когда указатель мыши покидает окно кнопки.
5.2. Кнопка-переключатель (ToggleButton)
Кнопки-переключатели (представленные классом Gtk::ToggleButton
) похожи на обычные кнопки (представленные классом Gtk::Button
), но после нажатия они остаются активированными или нажатыми до того момента, пока снова не будут нажаты.
Для получения состояния кнопки-переключателя вы можете использовать метод get_active()
. Он возвращает логическое значение true
в том случае, если кнопка "утоплена". Вы также можете установить состояние кнопки-переключателя с помощью метода set_active()
. Следует учесть, что в том случае, если вы сделаете это и состояние кнопки изменится, будет сгенерирован сигнал "clicked"
. Эти методы используются чаще всего.
Вы можете использовать метод toggled()
для изменения состояния кнопки вместо четкой установки того, должна ли кнопка находиться в обычном состоянии или быть утоплена: этот метод переключает состояние кнопки и приводит к генерации сигнала "toggled"
.
Класс Gtk::ToggleButton
важен, так как является базовым классом для классов Gtk::CheckButton
и Gtk::RadioButton
.
5.3. Флажок (CheckButton)
Класс Gtk::CheckButton
наследуется от класса Gtk::ToggleButton
. Единственным реальным различием между представленными этими классами виджетами является внешний вид виджета, представленного классом Gtk::CheckButton
. Вы можете проверять состояние виджета, устанавливать, а также изменять его используя те же методы, которые реализованы в рамках класса Gtk::ToggleButton
.
5.3.1. Пример
Рисунок 5-2: Флажок (CheckButton)
Файл examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
5.4. Радио-кнопка (RadioButton)
Как и класс, представляющий виджет флажков, класс, представляющий виджет радио-кнопок, наследуется от класса Gtk::ToggleButton
, но эти кнопки работают в составе групп и только одна радио-кнопка из группы может быть выбрана в любой момент времени.
5.4.1. Группы
RadioButtons
, после чего помещаем три радио-кнопки в это окно:
class RadioButtons : public Gtk::Window { public: RadioButtons(); protected: Gtk::RadioButton m_rb1, m_rb2, m_rb3; }; RadioButtons::RadioButtons() : m_rb1("кнопка1"), m_rb2("кнопка2"), m_rb3("кнопка3") { Gtk::RadioButton::Group group = m_rb1.get_group(); m_rb2.set_group(group); m_rb3.set_group(group); }
Мы сообщили gtkmm о необходимости размещения трех радио-кнопок в одной группе, получив идентификатор группы с помощью метода get_group()
и использовав метод set_group()
для перемещения остальных радио-кнопок в эту группу.
m_rb2.set_group(m_rb1.get_group()); //это не будет работать
ввиду того, что после использования метода set_group()
данные группы модифицируются и, следовательно, используемая для ее работы структура данных также не остается неизменной.
class RadioButtons : public Gtk::Window { public: RadioButtons(); }; RadioButtons::RadioButtons() { Gtk::RadioButton::Group group; Gtk::RadioButton *m_rb1 = Gtk::manage( new Gtk::RadioButton(group,"кнопка1")); Gtk::RadioButton *m_rb2 = manage( new Gtk::RadioButton(group,"кнопка2")); Gtk::RadioButton *m_rb3 = manage( new Gtk::RadioButton(group,"кнопка3")); }
Мы создали новую группу, просто объявив переменную group
типа Gtk::RadioButton::Group
. После этого мы создали три радио-кнопки, использовав конструкторы для того, чтобы добавить каждую из них в группу.
5.4.2. Методы
Радио-кнопки не активируются сразу же после создания; это значит, что в момент, когда вы создаете их группу, ни одна из них не будет выбрана. Не забудьте активировать одну из них, использовав метод set_active()
:
5.4.3. Пример
Следующий пример демонстрирует методику использования радио-кнопок:
Рисунок 5-3: Радио-кнопки (RadioButtons)
Файл radiobuttons.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл radiobuttons.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Следующий раздел : 6. Виджеты диапазонов.