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

UnixForum





Библиотека сайта rus-linux.net

Программирование с использованием gtkmm 3. Объекты установки диапазонов значений (Adjustments)

Оригинал: Programming with gtkmm 3
Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Дата публикации: 15 Октября 2013 г.
Перевод: А.Панин
Дата перевода: 15 марта 2014 г.

В gtkmm имеется много различных виджетов, которые позволяют изменять значение параметра в интерактивном режиме с использованием мыши или клавиатуры, таких, как виджеты диапазонов (описанные в главе под названием "Виджеты диапазонов"). Также существует несколько виджетов, которые отображают какой-либо небольшой указываемый фрагмент области большего размера, таких, как виджет частичного обзора (Viewport). Эти виджеты используют экземпляры класса Gtk::Adjustment, предоставляющие в их распоряжение стандартизированный API для установки диапазонов значений.

Так как приложения должны реагировать на изменение значения, к примеру в том случае, когда пользователь передвигает ползунок по полосе прокрутки, экземпляр класса Gtk::Adjustment предоставляет сигнал изменения значения "changed". После этого вы можете использовать метод get_changed() для получения нового значения.

14.1. Создание объекта установки диапазонов значений

Конструктор класса Gtk::Adjustment выглядит следующим образом:
Gtk::Adjustment(float value,
                float lower,
                float upper,
                float step_increment = 1,
                float page_increment = 10,
                float page_size = 0);

Аргумент value представляет начальное значение объекта установки диапазонов значений, обычно соответствующее наивысшему или максимальному значению, устанавливаемому средствами настраиваемого с помощью данного объекта виджета. Аргументы lower и upper устанавливают возможный диапазон значений, который будет использоваться объектом установки диапазонов значений. Аргумент step_increment устанавливает наименьшее из двух значений, на которое пользователь может изменять текущее значение, а аргумент page_increment - наибольшее. Аргумент page_size обычно как-либо связан с видимой областью панорамного виджета. Аргумент upper используется для представления координат самой нижней или самой правой точки дочернего виджета панорамного виджета.

14.2. Простая методика использования объектов установки диапазонов значений

Настраиваемые виджеты могут быть грубо разделены на виджеты, которые используют и требуют использования специфичных единиц для описываемых значений, а также на виджеты, которые трактуют значения как произвольные единицы.

Группа виджетов, трактующих значения как произвольные единицы, включает виджеты диапазонов (полосы прокрутки (ScrollBar) и виджет изменения значений (Scale)), виджет кнопки для изменения значения (ScaleButton) и виджет изменения числового значения (SpinButton). Значения, соответствующие этим виджетам обычно "изменяются" непосредственно пользователем с помощью мыши или клавиатуры. Эти виджеты будут трактовать значения параметров lower и upper объекта установки диапазонов значений как диапазон, в рамках которого пользователь может изменять текущее значение (значение параметра value) объекта установки диапазонов значений. По умолчанию они изменяют исключительно текущее значение (значение параметра value) объекта установки диапазонов значений.

Другая группа включает виджет частичного обзора (Viewport) и виджет окна прокрутки (ScrolledWindow). Все эти виджеты используют значения в пикселях для своих настроек. Состояние этих виджетов обычно изменяется опосредованно с помощью полос прокрутки. Хотя все эти виджеты, использующие объекты установки диапазонов значений, могут либо создавать свои объекты установки диапазонов значений, либо использовать переданные вами объекты, вы, скорее всего, предпочтете использовать собственные объекты установки диапазонов значений при работе с виджетами из данной категории.

В том случае, если вы делите объект установки диапазонов значений между виджетом полосы прокрутки и виджетом поля ввода текста, манипуляции с полосой прокрутки приведут к автоматической установке позиции виджета поля ввода текста. Для работы в описанном режиме вы можете осуществить настройки следующим образом:
// создание своего собственного объекта установки диапазонов значений
Gtk::TextView textview;
// использование только что созданного объекта установки диапазонов значений также для настройки полосы прокрутки 
Gtk::Scrollbar vscrollbar (textview.get_vadjustment(), Gtk::ORIENTATION_VERTICAL);

14.3. Внутреннее устройство объектов установки диапазонов значений

Вы можете спросить: "Хорошо, а что, если я захочу создать свои обработчики для работы в моменты, когда пользователь устанавливает значения с помощью виджета диапазона или виджета установки числового значения?" Для доступа к текущему значению объекта на основе класса Gtk::Adjustment вы можете использовать методы get_value() и set_value():

Как упоминалось ранее, класс Gtk::Adjustment предусматривает возможность генерации сигналов. С помощью этого механизма, разумеется, осуществляются обновления состояния виджетов в том случае, если вы делите объект установки диапазонов значений между виджетом полосы прокрутки и другим виджетом установки значения; все виджеты установки значений устанавливают обработчики сигналов для сигнала "value_changed" объекта установки диапазонов значений таким же образом, как можете сделать и вы в своей программе.

Например, в том случае, если вы используете виджет установки значения и хотите изменять угол поворота изображения по мере изменения значения с помощью виджета, вам придется создать обработчик сигнала, аналогичный следующему:
void cb_rotate_picture (Gtk::Widget *picture)
{
  picture->set_rotation (adj->value);
...
и соединить его с сигналом объекта установки диапазонов значений следующим образом:
adj.value_changed.connect(sigc::bind<Widget*>(sigc::mem_fun(*this,
    &cb_rotate_picture), picture));

Что произойдет в том случае, когда виджет изменит максимальное (upper) или минимальное (lower) значение объекта установки диапазонов значений таким же образом, как это делается при добавлении дополнительного текста в виджет поля ввода текста? В таком случае объектом установки диапазонов значений будет генерироваться сигнал "changed".

Виджеты диапазонов обычно устанавливают обработчик для этого сигнала, в рамках которого происходит соответствующее изменение состояния виджета - к примеру, размер ползунка полосы прокрутки будет увеличиваться или уменьшаться обратно пропорционально разности между минимальным (lower) и максимальным (upper) значениями соответствующего объекта установки диапазонов значений.

Вы, скорее всего, никогда не столкнетесь с необходимостью установки обработчика описанного сигнала, по крайней мере в том случае, если не будете разрабатывать новый тип виджета диапазона.
adjustment->changed();

Следующий раздел : Виджеты без окон оконной системы X.