В мире свободного бесплатного кроссплатформенного ПО трудно сразу определиться. Вот в статье "Не Кьютом единым" ("КВ" №3) речь шла о Code::Blocks как об альтернативе Кьюту. Но Code::Blocks предлагает и внутреннюю альтернативу!
Похоже, что фреймворк wxWidgets неплохо будоражит умы разработчиков, раз для него и не без его помощи четверо парней разработали автономный кроссплатформенный GUI-редактор wxFormBuilder (далее - "ФормБилдер"). О нём можно почитать на сайте wxformbuilder.org. Этим GUI-редактором можно создавать разнообразные формы с красивыми контролами, генерировать для них классы на языке C++ и XRC-коды, но, к сожалению, не более. В нём даже нельзя редактировать полученные коды. Для комфортной компиляции и отладки приложения нужна какая-то IDE. Однако, как связать "ФормБилдер" с IDE? Вразумительных ответов в Интернете я не нашёл. Даже сами разработчики "ФормБилдера" советуют просто вставлять сгенерированный код "куда-нибудь". Недостатки такой рекомендации очевидны: ошибки и плохая синхронизация между средами. Рекомендация, видимо, объясняется тем, что "ФормБилдер" в упор не видит никакой IDE из имеющихся на компьютере. Возможно, этот недостаток в дальнейшем и будет устранён, а пока что разработчики Code::Blocks (далее по-прежнему - СиБи) предложили своё решение. И довольно оригинальное.
Устанавливаем "ФормБилдер" и
библиотеки
Устанавливается "ФормБилдер" просто: подключаемся к Интернету и из терминала командуем: sudo apt-get install wxformbuilder. После загрузки-установки пакета идём в меню "Линукса" Приложения > Программирование и мышкой вытягиваем появившуюся иконку wxFB на рабочий стол. Но не спешите запускать этот GUI-редактор и начинать работать - ничего путного не выйдет: "ФормБилдер" работает с монолитной библиотекой виджетов. Придётся "по-взрослому" скомпилировать нужную библиотеку, причём для нужного интерфейсного порта "Линукса" - GTK2 или X11. Выбираем GTK2, получится универсальнее, красивее и будут учтены темы рабочего стола; поэтому устанавливаем вспомогательный пакет libgtk2.0-dev: вставляем в DVD-привод дистрибутив Ubuntu 8.10, подключаемся к Интернету и командуем: sudo apt-get install libgtk2.0-dev. Стало? Тогда можно устанавливать библиотеку виджетов. Идём на сайт wxwidgets.org и выкачиваем архив wxGTK-2.8.9.tar.gz. Распаковываем архив, в результате образуется поддиректория wxGTK-2.8.9. Переходим в неё. Под рутом или суперпользователем конфигурируем компиляцию командой ./configure --enable-monolithic, компилируем, как обычно, и командуем: ldconfig. Посмотреть, куда и какая установилась библиотека виджетов, можно командой wx-config --libs. В норме получаем нечто подобное: -L/usr/local/lib -pthread -lwx_gtk2-2.8. Перезагружаемся.
Связываем "ФормБилдер" и СиБи
Создадим в СиБи новый RAD-проект и в ответ на вопрос, какой GUI-редактор использовать, предпочтём использовать wxFormBuilder. После этого запустить встраиваемый GUI-редактор уже не удастся, так как при выборе внешнего встраиваемый отключается. Но не ищите, как запустить и внешний GUI-редактор. Фишка в том, что его не надо запускать! СиБи, помимо проекта "для себя", одновременно создаёт проект и для "ФормБилдера". Чтобы в этом убедиться, в "сибишном" окне Management на вкладке Projects идём Workspace > myfb > Others и видим файл wxWizFrame.fbp. Его просто надо открыть "ФормБилдером". Для этого на соседнем свободном рабочем столе (завидуйте, пользователи "Windows"!) запускаем "ФормБилдер", из его главного меню командуем File > Open, восходим к файлу wxWizFrame.fbp и дважды кликаем по нему, чем запускаем созданный из СиБи проект для "ФормБилдера" в виде формы с меню и статусбаром.
Проверим связь между "ФормБилдером" и СиБи. Находясь в "ФормБилдере", жмём Ctrl+S, сохраняя проект, затем жмём F8, чтобы сгенерировать файлы с кодами. Будут сгенерированы файлы GuiFrame.cpp и GuiFrame.h, которые являются общими для СиБи и "Формбилдера". Вот она, связь-то. Переключаемся на СиБи сменой рабочего стола, пересобираем и запускаем приложение. Если появилось окно приложения с куцым меню и пустым статусбаром, то всё нормально. Закрываем это окно.
Чтобы начать с чистой формы, удалим меню и статусбар. Для этого возвращаемся на рабочий стол с "ФормБилдером" и щёлкаем правой кнопкой мыши на дереве объектов Object Tree по ненужным элементам, каждый раз нажимая Delete.
Рисуем? Нет, строим!
Различия между встраиваемым GUI-редактором и "Форм-Билдером" в части инструментария не очень большие. Основное отличие - по-другому устроена панель быстрого управления и, кроме того, она вынесена в главную панель инструментов (рис. 1).
Рис. 1 |
На ней нет спина, регулирующего ширину бордюров элементов, этим свойством придётся управлять из инспектора объектов. Также нет кнопки просмотра XML-образа формы, вместо неё надо жать F5. Всё остальное есть с, в общем-то, небольшими отличиями. Сюрпризы будут при проектировании формы.
Идея тестового приложения прежняя: пользователь вводит текст в строку, жмёт кнопку, и текст добавляется в список, а строка очищается. Требования тоже прежние: изменения размеров окна приложения изменяют длину строки по горизонтали, список изменяют по обеим осям, кнопку изменения не затрагивают.
Итак, окно Editor на вкладке Designer содержит пустую форму. "Матерьялу" для начинки формы потребуется ровно столько же, как и в случае со встраиваемым GUI-редактором: пара сайзеров, строка, кнопка и список. Но в "ФормБилдере" проектирование интерфейса действительно больше похоже на строительство, чем на рисование: при щелчке по палитре элементы сразу попадают на форму без каких-либо перетаскиваний или дополнительных пассов, при этом внутри сайзеров элементы выстраиваются сверху-вниз или справа-налево в порядке поступления, причём поменять местами элементы внутри сайзера нельзя. Ошиблись - разбираем, то бишь стираем и строим заново. В этом и заключаются все сюрпризы. Впрочем, можно привыкнуть. Не трогая форму, щёлкаем на палитре: wxStaticBoxSizer, wxListBox, wxStaticBoxSizer, wxTextCtrl, wxButton. Выстроилось дерево объектов Object Tree (рис. 2).
Рис. 2 |
Щёлкаем на дереве образ второго сайзера и в инспекторе объектов меняем ориентацию на горизонтальную.
Далее настраиваем элементы, манипулируя их свойствами так, как это делалось для встраиваемого GUI-редактора в предыдущей статье. Главное - помнить, что в пределах сайзера для разрыва межэлементной размерной связи свойство Proportion одного из элементов следует сбрасывать в ноль. В отличие от встраиваемого GUI-редактора, "ФормБилдер" оставляет сайзеры видимыми, но так как инспектор объектов позволяет ставить на сайзеры лейблы, то это даже удобно. Сохраняемся, генерируем код, переключаемся с "ФормБилдера" на СиБи. Последний тревожно сообщает, что в файле GUIFrame.cpp произошли изменения, и спрашивает, не перезагрузить ли его. Жмём Yes, пересобираем и запускаем приложение. Кнопка в приложении, естественно, не работает. Закрываем приложение.
Возвращаемся в "ФормБилдер", на дереве объектов щёлкаем образ нашей кнопки, в инспекторе объектов вписываем в пустую строку обработчика события OnButtonClick какое-нибудь имя этого обработчика, например, AddStr. Сохраняемся, генерируем код и переключаемся в СиБи. Он опять просит разрешить перезагрузить файл GUIFrame.cpp, соглашаемся. В файле GUIFrame.cpp обнаруживаем, что в конструктор и деструктор формы добавились, соответственно, коннектор и дисконнектор обработчика AddStr, а в файл GUIFrame.h вставился новый член класса GUIFrame - обработчик события нажатия кнопки:
virtual void AddStr ( wxCommandEvent& event ) { event.Skip(); }
Вписываем между фигурными скобками процедуру обработки, аналогичную рассмотренной для встраиваемого GUI-редактора в прошлой статье, компилируем, запускаем и тестируем приложение. Закрываем приложение и не забываем сохранить "сибишный" проект. Исполняемый файл получается на 10-20% меньше, чем при использовании встраиваемого GUI-редактора.
Выводы
Недостатки, по сравнению со встраиваемым GUI-редактором: беднее палитра виджетов (например, нет диаграмм) и "строительство" формы меньше соответствует концепции RAD, чем рисование.
Достоинства: меньшие исполняемые файлы, разделение труда в команде ("ФормБилдер" и СиБи могут находиться на разных машинах с разными ОС) плюс относительная простота пополнения палитры новыми виджетами. Правда, как это делается, в данной статье не рассматривалось, я и так вас, вероятно, утомил.
Каким же GUI-редактором пользоваться? В команде, думается, "ФормБилдер" предпочтительнее. А в одиночку - как пожелаете, но с "ФормБилдером" экран всё же свободнее.
Михаил ГУРЧИК,
gor-mike@tut.by
Горячие темы