Наши партнеры

UnixForum





Библиотека сайта 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. Виджеты кнопок

gtkmm предоставляет четыре основных типа кнопок:
Обычные кнопки (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);
Всегда, когда это возможно, вам следует использовать стандартные кнопки (Stock Items) для достижения единообразия внешнего вида вашего приложения со сторонними приложениями, а также для улучшения внешнего вида ваших приложений посредством использования иконок. Например:
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)
Флажок (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)

Исходный код

Файл radiobuttons.h (Для использования совместно с gtkmm 3, а не с gtkmm 2)

Файл radiobuttons.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)

Файл main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)


Следующий раздел : 6. Виджеты диапазонов.