Программирование с gtkmm (Главы 1-5)

Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Jason M’Sadoques, Ole Laursen, Gene Ruebsamen, Cedric Gustin, Marko Anastasov, and Alan Ott, “Programming with gtkmm (Chapters 1-5)”, public translation into Russian from English More about this translation.

Translate into another language.

Глава 1. Введение

1.1. Для кого эта книга?
Эта книга расчитана на тех кто уже имеет не плохие знания о создании C++ приложений.

Вэтой книге объясняются ключевые концепции и некоторые наиболее часто используемые элементы интерфейса пользователя ("виджеты") gtkmm. Хоть в книге и упоминаются классы, конструкторы и методы, в ней нет углубления в детали. Полную информацию о API вы найдете, перейдя по ссылкам к справочной документации.

Этот документ находится в процессе разработки. Вы можете найти обновления на официальном сайте gtkmm (http://www.gtkmm.org/).

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


1.2. gtkmm
gtkmm – это C++ интерфейс для GTK+ (http://www.gtk.org/), библиотека для создания графических пользовательских интерфейсов. Она лицензирована с помощью лицензии LGPL, так что вы можете разрабатывать открытое программное обеспечение, свободное программное обеспечение, или даже коммерчеcкое ПО используя gtkmm, без приобретения лицензии.

Изначально gtkmm носила название gtk--. Но из-за сложности индексирования поисковыми системами была переименована в gtkmm.

1.2.1. Зачем использовать gtkmm вместо GTK+?
gtkmm позволяет писать код, используя технологии C++ такие как инкапсуляция, наследованием и полиморфизм. Как программист C++ вы, вероятно понимаете, что это приводит к более понятному и лучше организованному коду.

gtkmm более безопасен, так как компилятор может обнаружить ошибки, которые в коде на С будут обнаружены только во время выполнения. Использование специальных типов также делает API яснее. И вы можете понять, какие типы должны быть использованы просто посмотрев на обьявление метода.

Наследование может быть использовано для содания новых виджетов. Создание новых виджетов GTK+ в коде на C настолько осложнено и подверженно ошибке,что программисты на C пытаються избегать этого. Как C++ разработчик вы знаете, что наследование является основой объектно-ориентированного программирования..

В некоторых случаях могут быть использованы, упрашения управлению памятью. Со всеми GTK+ C графическими фрагментами связываются при помощи указателей. Как C++ кодер вы знаете, что указатели должны избегаться, когда это возможно.

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

1.2.2. Сравнение gtkmm с QT
QT от Trolltech является основным конкурентом gtkmm, поэтому она заслуживает обсуждения.

Основным приемуществом gtkmm над QT является его орентированность под C++. QT появилась в то время, когда C++ и его библиотеки не были стандартизированы, либо плохо поддерживалась компиляторами. По этой причине, в QT дублируется многое из того, что есть сейчас в стандартной библиотеке, например контейнеры и типы данных. Более того Trolltech модифицировали язык C++, для обеспечения сигналов, поэтому использование QT классов вместе с не-QT классами может вызвать трудности. gtkmm достаточно стандартного синтаксиса C++, для представления сигналов. За более детальными различиями обратитесь к FAQ.

1.2.3. gtkmm это оболочка
gtkmm это не инструментарий написанный для C++, а оболочка над инструментарием, написанным для C. Это отделение интерфейса и реализации имеет преимущества. gtkmm разработчики уделяют много времени тому, как gtkmm может предоставить четкий API, без неудобных компромисов благодаря неясным техническим деталям. Мы жертвуем малость, лежащему в основе коду GTK+, в отличие от того как делают C программисты, и Perl программисты, и Python программисты и т.д. Поэтому GTK+ приносит пользу от более широкой пользовательской базы, чем от языка конкретных инструментов, там существует больше исполнителей, больше разработчиков, больше тестеров и больше пользователей.

Из-за проблем в библиотеке MFC от Microsoft все графические бибиотеки-оболочки получили плохую репутацияю, но к gtkmm это не относиться, потому что GTK+ написана на высоком уровне объектно-ориентированного С, и без привязки к языку.

Глава 2. Установка

2.1. Зависимости
Перед установкой gtkmm 2.4, Вам, возможно, придётся установить эти пакеты.

• libsigc++ 2.0
• GTK+ 2.4
• cairomm

Эти зависимости имеют свои собственные зависимости, в том числе следующие приложения и библиотеки:

• pkg-config
• glib
• ATK
• Pango
• cairo

2.2. Unix и Linux

2.2.1. Предварительно собранные пакеты

Сегодня, почти во всех дистрибутивах есть установочные пакеты с последней версией gtkmm. Итак, если вы используете Linux, скорее всего вы сможете установить gtkmm из официального репозитория вашего дистрибутива. Дистрибутивы, которые включают в свои репозиториии gtkmm: Debian, Ubuntu, Red Hat, Fedora, Mandriva, Suse, и многие другие.

Имена пакетов gtkmm изменялись от сборки к сборке (например в Debian и Ubuntu пакет ности имя libgtkmm2.4-dev, а в Red Hat и Fedora gtkmm24-devel), так что найдите в программе управления пакетами вашего дистрибутива нужный пакет и установите его так, как установили бы любой другой.

Примечание: Названия пакетов не изменяются, с выходом в свет новой API/ABI-совместимой версии gtkmm. В противном случае, они уже не будут API/ABI-совместимыми. Так что не удивляйтесь, если, например, узнаете что gtkmm 2.8 поставляется Дебиановским пакетом libgtkmm2.4-dev

2.2.2. Установка из исходников
Если ваш дистрибутив не содержит заранее собранного gtkmm пакета, или если вы хотите установить другую версию, которая не предусмотренна для вашего дистрибутива, тогда вы можете установить gtkmm из исходного кода. Исходный код gtkmm можно загрузить с http://www.gtkmm.org/.

После того как вы установили все зависимости, скачали исходный код gtkmm, распаковали его, и измененили только что созданный каталог. gtkmm может быть собрана и установлена в следующей последовательности команд:

#./configure
#make
#make install

Примечание: Запомните, что на операционных системах Unix или Linux вам, возможно, необходимо быть root'ом для установки приложений. Консольная команда su позволяет ввести пароль root'а и временно получить его права.

Скрипт configure удостоверится, что все требуемые зависимости уже установлены. Если какая либо зависимость не выполнится, скрипт завершит свою работу и выведет сообщение об ошибке.

По умолчанию gtkmm будет установлен в директорию /usr/local. В некоторых системах возможно потребуется выбрать другую директорию. Например, в Red Hat Linux к команде configure можно добавить параметр --perfix для изменения директории, следующим образом:

# ./configure --prefix=/usr

Внимание

Надо быть очень осторожным, когда вы производите установку в стандартные системные директории, такие как /usr. Дистрибутивы Linux устанавливают своё ПО именно в /usr, так что установка исходного пакета в эту папку может повлечь за собой неполадки и конфликты с программами, установленными через менеджер установки пакетов.В идеале, вы должны использовать отдельный префикс для всех установок программного обеспечения из исходных кодов.

Если вы хотите помочь разработке gtkmm или экспериментируете с новыми возможностями, вы так же можете установить gtkmm из svn. Большинству пользователей это никогда не понадобится, но если вы заинтересовались в содействии разработчикам, откройте приложение Работа с субверсиями.

Microsoft Windows GTK+ и gtkmm были спроектированы для стабильной работы с Microsoft Windows, но разработчики охватили лишь платоформу win32. Хотя у Windows нет своей своей стандартной системы установки для библиотек для разработки. Пожалуйста, откройте Приложение Установка на Windows для просмотра инструкций и заметок по установке на ОС Windows.

Глава 3. Основы

В этой главе будут представлены некоторые из важнейших аспектов gtkmm-программирования. Здесь будут продемонстрированы примеры простого работающего кода. Однако, это просто пример, так что вам следует прочесть и другие главы для более полного понимания.

Ваши имеющиеся знания C++ помогут вам с gtkmm, как это будет с любой библиотекой. Если мы не заявляем иначе, вы можете полагать что классы gtkmm ведут себя так же, как и остальные классы языка С++, и вы можете рассчитывать на использование ваших имеющихся методов C++ и с классами gtkmm.

3.1. Простой пример
Изучение gtkmm мы начнем с простейшей программы. Эта программа создаст пустое окно размером 200x200 пикселей.

Исходные коды находятся по адресу: examples/others/base/base.cc

#include <gtkmm.h>

int main(int argc,char *argv[]){
Gtk::Main kit(argc, argv);

Gtk::Window window;

Gtk::Main::run(window);

return 0; }

Мы сейчас объясним каждую строку из примера.

#include <gtkmm.h>

Все gtkmm программы должны подключать определенные заголовочные файлы; gtkmm.h содержит целиком весь функционал gtkmm. Это обычно не очень хорошая идея, потому что он подключает более мегабайта заголовочных файлов, но для простой программы это подойдет.

Следущая строка:

Gtk::Main kit(argc,argv);

создает объект Gtk::Main. Это необходимо делать во всех gtkmm-приложениях. Конструктор для этого объекта инициализирует gtkmm и проверяет аргументы, переданные вашему приложению через командную строку, осуществляя поиск стандартных опций, таких как -display. Конструктор использует аргументы из переданного списка, пропуская те, что не смог распознать. Это позволяет убедиться в том, что все gtkmm-приложения принимают один и тот же стандартный набор аргументов.

Следущие две строки создают и отображают окно:

Gtk::Window window;

Последняя строка отображает окно и входит в основной цикл ожидания, который завершится когда окно будет закрыто.

Gtk::Main::run(window);

После вставки кода программы в simple.cc вы сможете собрать её с помощью gcc:

g++ simple.cc -o simple `pkg-config gtkmm-2.4 --cflags --libs`

Имейте в виду, что вы должны окружить pkg-config обратными кавычками. Обратные кавычки вызывают оболочку для выполнения команды внутри них, а также используют командный вывод как часть командной строки.

3.2 Заголовочные файлы и Компоновка

Хотя мы и показали команду компиляции для этого простого примера, на самом деле вы должны использовать automake и autoconf инструменты, как описано в книге "Autoconf, Automake, Libtool", G.V.Vaughan и др. Примеры, используемые в этой книге включены в пакет gtkmm с соответствующими файлами для сборки, поэтому мы не будем писать команду сборки в дальнейшем. Вам просто нужно найти соответствующий каталог, и ввести make.

Для упрощения компиляции мы используем pkg-config, который предоставляет все (корректно установленные) инсталляции gtkmm. Эта программа "знает", какие параметры нужны компилятору, чтобы собирать программы, использующие gtkmm. Опция --cflags позволяет pkg-config вывести список включаемых директорий, которые просматривает компилятор; опция --libs запрашивает список библиотек для подключения к компилятору и директории где их можно найти. Попробуйте вышеперечисленные опции в командной строке, чтобы увидеть как это работает в вашей системе.

Хотя, еще проще использовать макрос PKG_CHECK_MODULES() в стандартном файле configure.ac вместе с autoconf и automake. Например:

PKG_CHECK_MODULES([MYAPP],[gtkmm-2.4>=2.8.0])

Это проверки на наличие gtkmm и определения MYAPP_LIBS и MYAPP_CFLAGS для использования в вашем Makefile.am файле.

gtkmm-2.4 это название текущей стабильной API. Был более ранний API называемый gtkmm-2-0, который устанавливается параллельно, когда он имеется в наличии. Есть несколько версий gtkmm-2.4, такие как gtkmm 2.10. Имейте в виду, что название API не меняется c каждой версией, так что были бы несовместимые различия между API и ABI. Теоретически, может возникнуть в будущем gtkmm-3.0 API, который будет устанавливаться параллельно с gtkmm-2.4 без ущерба для существующих приложений.

Заметьте, что если вы упоминаете дополнительные модули, в дополнение к gtkmm-2.4, то они должны быть разделены пробелами, а не запятыми.

На сайте Openismus есть небольшая справка по automake и autoconf (http://www.openismus.com/documents/linux/automake/automake.shtml).

3.3. Виджеты

gtkmm приложения состоят из окон, содержащих виджеты, такие как кнопки и текстовые поля. В некоторых других системах, виджеты, называются "контролёры". Для каждого виджета окна в вашем приложении, есть объект C++ в коде приложения. Поэтому нужно просто вызвать метод класса виджета чтобы повлиять на видимый виджет.

Виджеты расположены внутри контейнера виджетов, таких как фраймы и вкладки, в иерархии виджетов в пределах виджетов. Некоторые из этих контейнеров, таких как Gtk::VBox, не видно, они существуют только для организации других виджетов. Вот несколько примеров кода, которая добавляет два Gtk::Button виджета в Gtk::VBox:

m_box.pack_start(m_Button1);
m_box.pack_start(m_Button2);

и здесь это метод для добавления Gtk::VBox, содержащий эти кнопки, в Gtk::Frame, который имеет видимую рамку и заголовок:

m_frame.add(m_box);

Большинство глав в этой книге, посвящены конкретным виджетам. Смотрите раздел Контейнер Виджетов за более подробной информацией о добавлении виджетов в контейнер.

Хотя вы можете указать расположение и внешний вид окон и виджетов посредством C++ кода, вам, вероятно, будет удобнее создавать пользовательские интерфейсы с помощью Glade и загружать их во время выполнения с libglademm. См. главу Glade и libglademm.

Хотя виджеты gtkmm имеют время жизни и область действия, как и обычные классы C++, gtkmm предоставляет возможность экономии времени, которую вы увидете чуть позже в нескольких примерах. Gtk::manage() позволяет вам указать что дочерний виджет принадлежит контейнеру, в который его поместили. Это позволит вам создать

новый виджет, добавить его в контейнер и забыть о его удалении. Вы можете узнать больше о управлении памятью в главе Управление памятью.

3.4. Сигналы

gtkmm, как и большинство GUI пакетов управляется событиями. Когда срабатывает событие, например нажатие кнопки мыши, виджет подаст сигнал о том, что на него нажали. Каждый виджет имеет свой набор сигналов, который он может вызывать. Чтобы обработать нажатие кнопки, мы устанавливаем обработчик сигнала, который будет реагировать на сигнал "clicked".

gtkmm использует libsigc++ библиотеку, чтобы использовать сигналы. Эта строка программы, которая соединяет сигнал нажатия Gtk::Button с обработчиком сигнала, называемый "on_button_clicked":

m_button1.signal_clicked().connect(sigc::mem_fun(*this,
&HelloWorld::on_button_clicked));

Для более подробной информации о сигналах, см. Приложение.

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

3.5. Glib::ustring

Возможно, вы удивитесь, узнав что в gtkmm интерфейсах не используется std::string. Вместо этого применяется Glib::ustring, который столь схож и ненавязчив, что вы можете не обращать внимания, представить что каждый GLib::ustring является STD::string и пропустить остальные части этой главы. Но если вы собираетесь использовать не только английский язык в интерфейсе вашей программы, то вам следует это прочесть.

std::string использует 8 битные символы, но восемь бит недостаточно для кодирования таких языков, как арабский, китайский и японский. Хотя Unicode Constortium уже указал спецификацию для этих языков, языки C и C++ до сих пор не поддерживают какую либо стандартизированную поддержку юникода. GTK+ и GNOME реализуют юникод используя UTF-8, это и есть библиотека Glib::ustring. Она предоставляет абсолютно такой же интерфейс, как std::string, в соответствии с автоматической конверсией в std::string и обратно.

Одно из достоинств кодировки UTF-8 в том что вы можете не испотльзовать ее, если вы в этом не нуждаетесь. std::string все равно будет работать для 7-ми битных ASCII строк. Но когда вы пробуете локализовать ваше приложение для языков подобных китайскому, вы начнете видеть странные ошибки, а возможно и аварийные завершения. Тогда все, что вам нужно сделать - начать, использовать Glib::ustring.

Обратите внимание, что UTF-8 не совместима с 8-битным кодировками, таких как с ISO-8859-1. Например, немецкий умляут не входит в диапазон ASCII и требует более чем одного байта UTF-8 кодировке. Если ваш код содержит 8-битные строковые литералы, вам придется конвертировать их в UTF-8 (например, Баварское приветствие "Grüß Gott" должен быть представлен как "Gr\xC3\xBC\xC3\x9F Gott").

Лучше избегать адресную арифметику в стиле C, и функции, такие как strlen(). В UTF-8 на каждый символ может потребоваться от 1 до 6 байт, так что не возможно оценить является ли следущий байт новым символом или нет. Библиотека Glib::ustring позаботится об этих деталях, вы можете использовать такие методы, как Glib::ustring::substr() когда речь идет о последовательности символов, а не байт.

Кодировка юникод, в отличие от решения Windows UCS-2 Unicode, не требует специальных опций компилятора для того, чтобы обрабатывать строковые литералы. А так же не отражается на юникод-исполняемых файлах и библиотеках, несовместимых с такими же проектами с использованием ASCII.

Справочная информация (../../../../glibmm-2.4/docs/reference/html/classGlib_1_1ustring.html)

Смотрите раздел Интернационализация(глава24), о строковых литералах, предоставляемых кодировкой UTF-8.

3.6 Вспомогательные типы

Некоторые части gtkmm API используют вспомогательные контейнеры данных, такие как Glib::StringArrayHandle вместо стандартного C++ контейнера std::vector или std::list. Вам не нужно вручную объявлять эти типы - просто используйте любой стандартный С++ контейнер который вы предпочитаете: gtkmm выполнит преобразование за вас. Вот несколько вспомогательных типов:

• Glib::StringArrayHandle or Glib::ArrayHandle<Glib::ustring>: Use std::vector<Glib::ustring>, std::list<Glib::ustring>, const char*[], etc.

• Glib::ListHandle<Gtk::Widget*>: Use std::vector<Gtk::Widget*>, std::list<Gtk::Widget*>, etc.

• Glib::SListHandle<Gtk::Widget*>: Use std::vector<Gtk::Widget*>, std::list<Gtk::Widget*>, etc.

3.7. Hello World в gtkmm
На данном этапе мы выучили достаточно чтобы рассмотреть хороший пример. Следуя древнейшей традиции информатики, мы начнем с Hello World, а-ля gtkmm:

Исходный код (../../../examples/book/helloworld)

Файл: helloworld.h

Pages: ← previous Ctrl next
1 2 3 4 5

© Copyright © 2002-2006 Murray Cumming

Original (English): Programming with gtkmm (Chapters 1-5)

Translation: © JBL, Ануфриев Дмитрий, space_indus, netrino, kronos, Vetrik, lynx, kardan, nickolay, VisualPaul, Антон, Viona, Ainar-G, plazmagod, grishnan .

License: Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and

translated.by crowd

Like this translation? Share it or bookmark!