Ultimate++

Поделись знанием:
Перейти к: навигация, поиск
Ultimate++

Снимок U++ TheIDE (выбран редактор компоновок)
Тип

Библиотека элементов интерфейса (виджетов), IDE

Разработчик

Mirek Fídler, Koldo Ramirez, Tomáš Rylek, Daniel Kos + участники проекта

Написана на

C++

Операционная система

Кроссплатформенный

Последняя версия

2015.2 (rev 9251) (1 декабря 2015)

Лицензия

BSDL

Сайт

[ultimatepp.org/ epp.org]

Ultimate++Ultimate++

Ultimate++ (известен также как U++ и UPP) — кросс-платформенный инструментарий разработки ПО на языке программирования C++. Целью U++ является уменьшение сложности типичных десктопных приложений за счёт интенсивного использования особенностей C++. Работает под Linux/X11, BSD/X11 и Windows.

Проект развивается с 1999 года, ядро Ultimate++ team составляют чешские программисты.





Особенности

Состав и назначения фреймворка

Представляет собой фреймворк, призванный не только обеспечить быструю разработку GUI-приложений, но и, в идеале, заменить все сторонние библиотеки и инструменты для С++, включая даже STL (роль которой в U++ выполняет библиотека NTL — New Template Library). Этим Ultimate++ похоже на Qt, хотя идёт в данном направлении ещё дальше. Однако UPP, в отличие от Qt, не расширяет C++ с помощью нестандартных макрообработчиков исходного текста, все высокоуровневые средства этого фреймворка, выглядящие как расширения языка С++, выполнены за счёт стандартных механизмов вроде шаблонного метапрограммирования (англ.) и макросов. Это даёт возможность использовать при создании интерфейса механизм шаблонов, что позволяет добиться компактного и легко читаемого кода. По лаконичности код, написанный с использованием U++, напоминает современные скриптовые языки «сверхвысокого уровня».

В состав Ultimate++ входят следующие библиотеки:

  • Core — работа со строками, датами и временем, библиотека контейнеров NTL (аналог STL), обратные вызовы, поддержка многопоточности, работа с XML и т. д.;
  • Draw — базовые графические операции, включая обработку растровых изображений.
  • CtrlCore — ядро GUI-приложений, обеспечивающее отображение окон, передачу событий, обработку логических координат и т. п.;
  • CtrlLib — собственно, библиотека виджетов;
  • RichText — работа со сложным форматированным текстом, включая импорт/экспорт в RTF и HTML.
  • SQL — функции для работы с SQL-запросами, интерфейсы к СУБД SQLite 3, MySQL, PostgreSQL, MS SQL, Oracle;
  • Esc — встраиваемый интерпретатор скриптового языка;
  • Web — функции работы с сетью и интернетом;
  • и инструменты:
  • BLITZ-build — система автоматизации сборки (компиляции) приложений;
  • TheIDE — интегрированная среда разработки с визуальным редактором компоновки виджетов;
  • Topic++ — генератор документации;
  • Assist++ — система анализа, автодополнения и оптимизации кода.

Все эти компоненты рассчитаны на совместное использование и не предназначены для работы по отдельности. Ultimate++ использует специфическую организацию кода в виде т. н. «пакетов», поэтому разработка с Ultimate++, но без использования TheIDE вряд ли возможна на практике.

Организация исходных текстов

Работа с исходными текстами в U++ происходит в категориях пакетов (идея, привычная разработчикам на Delphi или Lazarus), а не разрозненных библиотек и исходных файлов. Технически пакет — это просто содержащая исходные коды отдельная директория, в которой также находится файл-описание с расширением upp. .upp-файлы обновляются IDE автоматически и являются аналогами make-файлов с описанием зависимостей и флагов компиляции.

При подключении пакета к проекту IDE установит необходимые пути и флаги для компилятора автоматически. Сам проект также является пакетом, который можно подключить к другим проектам-пакетам. Несколько пакетов объединяются в «гнездо» (nest), а гнезда — в коллекции (assemblies).

TheIDE размещает все созданные в нём программы в общее глобальное дерево пакетов. Корень дерева пакетов выбирается пользователем при первом запуске IDE, а все его программы будут хранится только в поддиректориях этого каталога.

Особенности работы с виджетами

Главным отличием от других библиотек аналогичного назначения является то, что все виджеты как правило создаются статически, как обычные переменные-члены класса (хотя сохраняется и возможность динамическое создания виджетов). Существуют особые типы полей ввода для вещественных и целых чисел. Например виджеты окна программы-калькулятора могут быть описаны так:

class MyWindow : public TopWindow {
public:
    EditDouble val1, val2; // Поля ввода для операндов
    Label l1,l2;           // Подписи для полей ввода
    DropList operation;    // Выпадающий список операций
    Label l3;              // Подпись для списка
    Button compute;        // Кнопка «вычислить»
    Label result;          // Надпись для результата

Затем, при размещении виджетов вручную, мы должны расположить в окне программы с помощью функции Add(widget) (пример её использования см. в разделе Hello World).

На самом деле объекты поддержки виджетов существуют в динамической памяти, но они скрыты из области видимости и создаются и уничтожаются автоматически, мы оперируем только с их статическими «обёртками». Это позволяет избавится от ручного управления памятью, вы уже не сможете организовать утечку памяти, забыв написать delete. Хорошая практика программирования с Ultimate++ — никогда не использовать указатели для управления ресурсами. Для управления наборами данных переменного размера или полиморфного типа, используются контейнеры NTL. «Умных указателей» (типа boost::shared_ptr), в NTL нет, они не нужны и считаются плохой практикой. Такой подход к управлению памятью в C++ хорошо зарекомендовал себя, практически не уступая сборке мусора по удобству использования и превосходя её по производительности и детерминированности поведения программы.

Любой виджет в U++ имеет некое «естественное» значение. Так, для поля ввода значением будет введённый текст, для списка – выбранный элемент, для кнопки – функция-обработчик её нажатия. Для получения значения виджета служит оператор ~widget (возвращает значение вариантного типа Value), а для установки – оператор widget <<= значение. Чтобы установить в качестве значения виджета, такого как кнопка, функцию обработчик, нужно «обернуть» имя соотв. функции-члена класса в макрос THISBACK().

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

Использование Layout Editor

Существует альтернатива ручному размещению виджетов в конструкторе окна — визуальный редактор компоновок (Layout Editor). Компоновки созданные в нём представляют собой корректные с точки зрения C++ include-файлы, использующие специальные макросы и имеющие расширение .lay. Для работы с компоновками мы должны подключить к нашему С++ файлу библиотеку заголовков lay.h, которая автоматически подключает файл-компоновки заданный c помощью директивы #define LAYOUTFILE.

#define LAYOUTFILE <demo/demo1.lay>
#include <CtrlCore.h>

Если компоновка называется, к примеру main, то для её подключения к классу главного окна программы надо объявить его как

class MyWindow : public Withmain<TopWindow> {

где Withmain — шаблонный класс, автоматически созданный макросами lay.h на основании lay-файла. Используется шаблона, а не простой класс или структура, благодаря чему как базовый класс вы можете использовать не только диалоговое окно (TopWindow) но и любой тип виджета.

Чтобы разместить виджеты окна согласно компоновке, в начало конструктора файла надо добавить вызов

CtrlLayout(*this);

Такой подход к визуальному редактированию интерфейса позволяет статически компилировать файлы компоновки, а не интерпретировать их во время работы программы, как это делают многие GUI инструменты, что ведёт к повышению быстродействия созданных в Ultimate++ приложений.

Однако, редактор компоновок не является полноценным визуальным редактором интерфейса, таким как QtDesigner или Glade. Он лишь позволяет задать имена и относительные положения виджетов одного уровня иерархии. Все свойства виджетов (кроме простейших, вроде надписи на кнопке) и логика их взаимодействия прописываются в коде программы.

Примеры

Минимальное приложение

#include <CtrlLib/CtrlLib.h>

using namespace Upp;

GUI_APP_MAIN 
{

}

Создание окна

#include <CtrlLib/CtrlLib.h>

using namespace Upp;

class MyWindow : public TopWindow {
public:
    MyWindow() {
        Title("Hello world!");
        MinimizeBox();
        MaximizeBox();
        Sizeable();
        SetRect(0, 0, 300, 300); 
    }
};

GUI_APP_MAIN
{
    MyWindow().Run();
}

Hello World

В следующем примере создаётся (без использования визуального редактора) приложение с кнопкой «HelloWorld».

#include <CtrlLib/CtrlLib.h>

using namespace Upp;

class MyApp : public TopWindow {
    typedef MyApp CLASSNAME;

public:
    MyApp() {
        Title("Hello world");
	button.SetLabel("Hello world!");
	button <<= THISBACK(Click);
 	Add(button.HSizePos(100, 100).VSizePos(100, 100));
    }
    
private:
    void Click() {
        if(PromptYesNo("Button was clicked. Do you want to quit?"))
	    Break();
    }

    Button button;
};

GUI_APP_MAIN
{
    MyApp().Run();
}

Более сложный пример

В разделе [ultimatepp.org/www$uppweb$comparison$en-us.html Comparisons] официального сайта вы сможете найти примеры создания на U++ достаточно сложной формы и сравнить её с реализацией аналогичного функционала на Qt, wxWidgets и Java/Swing.

Напишите отзыв о статье "Ultimate++"

Примечания

Ссылки

  • [ultimatepp.org/ Официальный сайт] (англ.)
  • [www.ultimatepp.org/www$uppweb$overview$ru-ru.html Обзор Ultimate++] (рус.)
  • [www.kv.by/index2007261105.htm Вадим Станкевич. Ultimate++ — Больше, чем просто хорошая среда разработки] (рус.), обзор библиотеки в белорусском еженедельнике «Компьютерные вести» (№ 26, 2007).
  • [www.kv.by/index2009061109.htm Михаил Гурчик. Славянская RAD-IDE]. «Компьютерные вести» (№ 6, 2009).
  • Тимур Шарипов. [habrahabr.ru/post/194590/ Впечатления от знакомства с Ultimate++] (Хабрахабр, 2013).
  • Семен Есилевский. Нестандартные GUI-тулкиты.
    • Часть 1: Знакомство с Ultimate++. [osa.samag.ru/get/OpenSource068.zip «Open Source» № 68] (PDF, 2.5 МБ) (бесплатное приложение к [www.samag.ru/ журналу «Системный администратор»])
    • Часть 2: Магия Ultimate++, [osa.samag.ru/get/OpenSource069.zip «Open Source» № 69] (PDF, 2 МБ)
    • Часть 3: Базы данных в Ultimate++, [osa.samag.ru/get/OpenSource070.zip «Open Source» № 70] (PDF, 2 МБ)
    • Часть 4: Графика в Ultimate++ и общие выводы [osa.samag.ru/get/OpenSource071.zip «Open Source» № 71] (PDF, 2 МБ)

Отрывок, характеризующий Ultimate++

– Что, что? от кого? – проговорил чей то сонный голос.
– От Дохтурова и от Алексея Петровича. Наполеон в Фоминском, – сказал Болховитинов, не видя в темноте того, кто спрашивал его, но по звуку голоса предполагая, что это был не Коновницын.
Разбуженный человек зевал и тянулся.
– Будить то мне его не хочется, – сказал он, ощупывая что то. – Больнёшенек! Может, так, слухи.
– Вот донесение, – сказал Болховитинов, – велено сейчас же передать дежурному генералу.
– Постойте, огня зажгу. Куда ты, проклятый, всегда засунешь? – обращаясь к денщику, сказал тянувшийся человек. Это был Щербинин, адъютант Коновницына. – Нашел, нашел, – прибавил он.
Денщик рубил огонь, Щербинин ощупывал подсвечник.
– Ах, мерзкие, – с отвращением сказал он.
При свете искр Болховитинов увидел молодое лицо Щербинина со свечой и в переднем углу еще спящего человека. Это был Коновницын.
Когда сначала синим и потом красным пламенем загорелись серники о трут, Щербинин зажег сальную свечку, с подсвечника которой побежали обгладывавшие ее прусаки, и осмотрел вестника. Болховитинов был весь в грязи и, рукавом обтираясь, размазывал себе лицо.
– Да кто доносит? – сказал Щербинин, взяв конверт.
– Известие верное, – сказал Болховитинов. – И пленные, и казаки, и лазутчики – все единогласно показывают одно и то же.
– Нечего делать, надо будить, – сказал Щербинин, вставая и подходя к человеку в ночном колпаке, укрытому шинелью. – Петр Петрович! – проговорил он. Коновницын не шевелился. – В главный штаб! – проговорил он, улыбнувшись, зная, что эти слова наверное разбудят его. И действительно, голова в ночном колпаке поднялась тотчас же. На красивом, твердом лице Коновницына, с лихорадочно воспаленными щеками, на мгновение оставалось еще выражение далеких от настоящего положения мечтаний сна, но потом вдруг он вздрогнул: лицо его приняло обычно спокойное и твердое выражение.
– Ну, что такое? От кого? – неторопливо, но тотчас же спросил он, мигая от света. Слушая донесение офицера, Коновницын распечатал и прочел. Едва прочтя, он опустил ноги в шерстяных чулках на земляной пол и стал обуваться. Потом снял колпак и, причесав виски, надел фуражку.
– Ты скоро доехал? Пойдем к светлейшему.
Коновницын тотчас понял, что привезенное известие имело большую важность и что нельзя медлить. Хорошо ли, дурно ли это было, он не думал и не спрашивал себя. Его это не интересовало. На все дело войны он смотрел не умом, не рассуждением, а чем то другим. В душе его было глубокое, невысказанное убеждение, что все будет хорошо; но что этому верить не надо, и тем более не надо говорить этого, а надо делать только свое дело. И это свое дело он делал, отдавая ему все свои силы.
Петр Петрович Коновницын, так же как и Дохтуров, только как бы из приличия внесенный в список так называемых героев 12 го года – Барклаев, Раевских, Ермоловых, Платовых, Милорадовичей, так же как и Дохтуров, пользовался репутацией человека весьма ограниченных способностей и сведений, и, так же как и Дохтуров, Коновницын никогда не делал проектов сражений, но всегда находился там, где было труднее всего; спал всегда с раскрытой дверью с тех пор, как был назначен дежурным генералом, приказывая каждому посланному будить себя, всегда во время сраженья был под огнем, так что Кутузов упрекал его за то и боялся посылать, и был так же, как и Дохтуров, одной из тех незаметных шестерен, которые, не треща и не шумя, составляют самую существенную часть машины.
Выходя из избы в сырую, темную ночь, Коновницын нахмурился частью от головной усилившейся боли, частью от неприятной мысли, пришедшей ему в голову о том, как теперь взволнуется все это гнездо штабных, влиятельных людей при этом известии, в особенности Бенигсен, после Тарутина бывший на ножах с Кутузовым; как будут предлагать, спорить, приказывать, отменять. И это предчувствие неприятно ему было, хотя он и знал, что без этого нельзя.
Действительно, Толь, к которому он зашел сообщить новое известие, тотчас же стал излагать свои соображения генералу, жившему с ним, и Коновницын, молча и устало слушавший, напомнил ему, что надо идти к светлейшему.


Кутузов, как и все старые люди, мало спал по ночам. Он днем часто неожиданно задремывал; но ночью он, не раздеваясь, лежа на своей постели, большею частию не спал и думал.
Так он лежал и теперь на своей кровати, облокотив тяжелую, большую изуродованную голову на пухлую руку, и думал, открытым одним глазом присматриваясь к темноте.
С тех пор как Бенигсен, переписывавшийся с государем и имевший более всех силы в штабе, избегал его, Кутузов был спокойнее в том отношении, что его с войсками не заставят опять участвовать в бесполезных наступательных действиях. Урок Тарутинского сражения и кануна его, болезненно памятный Кутузову, тоже должен был подействовать, думал он.
«Они должны понять, что мы только можем проиграть, действуя наступательно. Терпение и время, вот мои воины богатыри!» – думал Кутузов. Он знал, что не надо срывать яблоко, пока оно зелено. Оно само упадет, когда будет зрело, а сорвешь зелено, испортишь яблоко и дерево, и сам оскомину набьешь. Он, как опытный охотник, знал, что зверь ранен, ранен так, как только могла ранить вся русская сила, но смертельно или нет, это был еще не разъясненный вопрос. Теперь, по присылкам Лористона и Бертелеми и по донесениям партизанов, Кутузов почти знал, что он ранен смертельно. Но нужны были еще доказательства, надо было ждать.
«Им хочется бежать посмотреть, как они его убили. Подождите, увидите. Все маневры, все наступления! – думал он. – К чему? Все отличиться. Точно что то веселое есть в том, чтобы драться. Они точно дети, от которых не добьешься толку, как было дело, оттого что все хотят доказать, как они умеют драться. Да не в том теперь дело.
И какие искусные маневры предлагают мне все эти! Им кажется, что, когда они выдумали две три случайности (он вспомнил об общем плане из Петербурга), они выдумали их все. А им всем нет числа!»
Неразрешенный вопрос о том, смертельна или не смертельна ли была рана, нанесенная в Бородине, уже целый месяц висел над головой Кутузова. С одной стороны, французы заняли Москву. С другой стороны, несомненно всем существом своим Кутузов чувствовал, что тот страшный удар, в котором он вместе со всеми русскими людьми напряг все свои силы, должен был быть смертелен. Но во всяком случае нужны были доказательства, и он ждал их уже месяц, и чем дальше проходило время, тем нетерпеливее он становился. Лежа на своей постели в свои бессонные ночи, он делал то самое, что делала эта молодежь генералов, то самое, за что он упрекал их. Он придумывал все возможные случайности, в которых выразится эта верная, уже свершившаяся погибель Наполеона. Он придумывал эти случайности так же, как и молодежь, но только с той разницей, что он ничего не основывал на этих предположениях и что он видел их не две и три, а тысячи. Чем дальше он думал, тем больше их представлялось. Он придумывал всякого рода движения наполеоновской армии, всей или частей ее – к Петербургу, на него, в обход его, придумывал (чего он больше всего боялся) и ту случайность, что Наполеон станет бороться против него его же оружием, что он останется в Москве, выжидая его. Кутузов придумывал даже движение наполеоновской армии назад на Медынь и Юхнов, но одного, чего он не мог предвидеть, это того, что совершилось, того безумного, судорожного метания войска Наполеона в продолжение первых одиннадцати дней его выступления из Москвы, – метания, которое сделало возможным то, о чем все таки не смел еще тогда думать Кутузов: совершенное истребление французов. Донесения Дорохова о дивизии Брусье, известия от партизанов о бедствиях армии Наполеона, слухи о сборах к выступлению из Москвы – все подтверждало предположение, что французская армия разбита и сбирается бежать; но это были только предположения, казавшиеся важными для молодежи, но не для Кутузова. Он с своей шестидесятилетней опытностью знал, какой вес надо приписывать слухам, знал, как способны люди, желающие чего нибудь, группировать все известия так, что они как будто подтверждают желаемое, и знал, как в этом случае охотно упускают все противоречащее. И чем больше желал этого Кутузов, тем меньше он позволял себе этому верить. Вопрос этот занимал все его душевные силы. Все остальное было для него только привычным исполнением жизни. Таким привычным исполнением и подчинением жизни были его разговоры с штабными, письма к m me Stael, которые он писал из Тарутина, чтение романов, раздачи наград, переписка с Петербургом и т. п. Но погибель французов, предвиденная им одним, было его душевное, единственное желание.
В ночь 11 го октября он лежал, облокотившись на руку, и думал об этом.
В соседней комнате зашевелилось, и послышались шаги Толя, Коновницына и Болховитинова.
– Эй, кто там? Войдите, войди! Что новенького? – окликнул их фельдмаршал.
Пока лакей зажигал свечу, Толь рассказывал содержание известий.
– Кто привез? – спросил Кутузов с лицом, поразившим Толя, когда загорелась свеча, своей холодной строгостью.
– Не может быть сомнения, ваша светлость.
– Позови, позови его сюда!
Кутузов сидел, спустив одну ногу с кровати и навалившись большим животом на другую, согнутую ногу. Он щурил свой зрячий глаз, чтобы лучше рассмотреть посланного, как будто в его чертах он хотел прочесть то, что занимало его.
– Скажи, скажи, дружок, – сказал он Болховитинову своим тихим, старческим голосом, закрывая распахнувшуюся на груди рубашку. – Подойди, подойди поближе. Какие ты привез мне весточки? А? Наполеон из Москвы ушел? Воистину так? А?
Болховитинов подробно доносил сначала все то, что ему было приказано.
– Говори, говори скорее, не томи душу, – перебил его Кутузов.
Болховитинов рассказал все и замолчал, ожидая приказания. Толь начал было говорить что то, но Кутузов перебил его. Он хотел сказать что то, но вдруг лицо его сщурилось, сморщилось; он, махнув рукой на Толя, повернулся в противную сторону, к красному углу избы, черневшему от образов.