Ultimate++: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м Унификация {{нпX}}×1
 
(не показано 10 промежуточных версий 8 участников)
Строка 5: Строка 5:
| caption = Снимок U++ TheIDE (выбран редактор компоновок)
| caption = Снимок U++ TheIDE (выбран редактор компоновок)
| genre = Библиотека [[Элемент интерфейса|элементов интерфейса (виджетов)]], [[Интегрированная среда разработки|IDE]]
| genre = Библиотека [[Элемент интерфейса|элементов интерфейса (виджетов)]], [[Интегрированная среда разработки|IDE]]
| developer = Mirek Fídler, Koldo Ramirez, Tomáš Rylek, Daniel Kos + участники проекта
| developer = Mirek Fídler, , Tomáš Rylek, Daniel Kos + участники проекта
| programming_language = [[C++]]
| programming_language = [[C++]]
| operating_system = [[Кроссплатформенное программное обеспечение|Кроссплатформенный]]
| operating_system = [[Кроссплатформенное программное обеспечение|Кроссплатформенный]]
| последняя версия = 2022.2 (rev. 16270) ([[27 мая]] [[2022]])
|latest rc version =
|latest rc date =
|latest rc =
|latest rc =
| license = [[BSDL]]
| license = [[BSDL]]
| website = http://ultimatepp.org/
| website = http://ultimatepp.org/
}}
}}


'''Ultimate++''' (известен также как '''U++''' и '''UPP''') — [[Кроссплатформенное программное обеспечение|кросс-платформенный]] инструментарий разработки ПО на языке программирования [[C++]]. Целью U++ является уменьшение сложности типичных десктопных приложений за счёт интенсивного использования особенностей C++. Работает под [[Linux]]/[[X11]], [[BSD]]/[[X11]], [[Windows]] и, начиная с версии 2019.1 [[MacOS X]]. Поддержка разработки для [[Android]] находится в состоянии разработки<ref>[https://www.ultimatepp.org/app$ide$AndroidBuilder$en-us.html Working with Android builder]</ref>.
'''Ultimate++''' (известен также как '''U++''' и '''UPP''') — [[Кроссплатформенное программное обеспечение|кросс-платформенный]] инструментарий разработки ПО на языке программирования [[C++]]. Целью U++ является уменьшение сложности типичных десктопных приложений за счёт интенсивного использования особенностей C++. Работает под [[Linux]]/[[X11]], [[BSD]]/[[X11]], [[Windows]] и, начиная с версии 2019.1 [[]]. Поддержка разработки для [[Android]] находится в состоянии разработки<ref>https://www.ultimatepp.org/app$ide$AndroidBuilder$en-us.html Working with Android builder</ref>.


Проект развивается с [[1999]] года, ядро '''Ultimate++ team''' составляют [[Чехия|чешские]] программисты.
Проект развивается с [[1999]] года, ядро '''Ultimate++ team''' составляют [[Чехия|чешские]] программисты.
Строка 21: Строка 22:


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


В состав Ultimate++ входят следующие библиотеки:
В состав Ultimate++ входят следующие библиотеки:
Строка 38: Строка 39:
:* '''Assist++''' — система анализа, автодополнения и оптимизации кода.
:* '''Assist++''' — система анализа, автодополнения и оптимизации кода.


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


=== Организация исходных текстов ===
=== Организация исходных текстов ===
Строка 73: Строка 74:
=== Использование Layout Editor ===
=== Использование Layout Editor ===


Существует альтернатива ручному размещению виджетов в конструкторе окна — визуальный редактор компоновок (Layout Editor). ''Компоновки'' созданные в нём представляют собой корректные с точки зрения C++ include-файлы, использующие специальные макросы и имеющие расширение <tt>.lay</tt>. Для работы с компоновками мы должны подключить к нашему С++ файлу библиотеку заголовков lay.h, которая автоматически подключает файл-компоновки заданный c помощью директивы <code>#define LAYOUTFILE</code>.
Существует альтернатива ручному размещению виджетов в конструкторе окна — визуальный редактор компоновок (Layout Editor). ''Компоновки'' созданные в нём представляют собой корректные с точки зрения C++ include-файлы, использующие специальные макросы и имеющие расширение <tt>.lay</tt>. Для работы с компоновками мы должны подключить к нашему ++ файлу библиотеку заголовков lay.h, которая автоматически подключает файл-компоновки заданный c помощью директивы <code>#define LAYOUTFILE</code>.
<source lang="cpp">
<source lang="cpp">
#define LAYOUTFILE <demo/demo1.lay>
#define LAYOUTFILE <demo/demo1.lay>
Строка 144: Строка 145:
MyApp() {
MyApp() {
Title("Hello world");
Title("Hello world");
button.SetLabel("Hello world!");
button.SetLabel("Hello world!");
button <<= THISBACK(Click);
button <<= THISBACK(Click);
Add(button.HSizePos(100, 100).VSizePos(100, 100));
Add(button.HSizePos(100, 100).VSizePos(100, 100));
}
}
Строка 152: Строка 153:
void Click() {
void Click() {
if(PromptYesNo("Button was clicked. Do you want to quit?"))
if(PromptYesNo("Button was clicked. Do you want to quit?"))
Break();
Break();
}
}


Строка 178: Строка 179:
* Тимур Шарипов. [http://habrahabr.ru/post/194590/ Впечатления от знакомства с Ultimate++] (Хабрахабр, 2013).
* Тимур Шарипов. [http://habrahabr.ru/post/194590/ Впечатления от знакомства с Ultimate++] (Хабрахабр, 2013).
* Семен Есилевский. Нестандартные GUI-тулкиты.
* Семен Есилевский. Нестандартные GUI-тулкиты.
** Часть 1: Знакомство с Ultimate++. [http://osa.samag.ru/get/OpenSource068.zip «Open Source» № 68]{{Недоступная ссылка|date=Май 2018 |bot=InternetArchiveBot }}{{ref-pdf|2.5}} (бесплатное приложение к [http://www.samag.ru/ журналу «Системный администратор»])
** Часть 1: Знакомство с Ultimate++. [http://osa.samag.ru/get/OpenSource068.zip «Open Source» № 68]{{Недоступная ссылка|date=2018|bot=InternetArchiveBot }}{{ref-pdf|2.5}} (бесплатное приложение к [http://www.samag.ru/ журналу «Системный администратор»])
** Часть 2: Магия Ultimate++, [http://osa.samag.ru/get/OpenSource069.zip «Open Source» № 69]{{Недоступная ссылка|date=Май 2018 |bot=InternetArchiveBot }}{{ref-pdf|2}}
** Часть 2: Магия Ultimate++, [http://osa.samag.ru/get/OpenSource069.zip «Open Source» № 69]{{Недоступная ссылка|date=2018|bot=InternetArchiveBot }}{{ref-pdf|2}}
** Часть 3: Базы данных в Ultimate++, [https://web.archive.org/web/20110516132259/http://osa.samag.ru/get/OpenSource070.zip «Open Source» № 70]{{ref-pdf|2}}
** Часть 3: Базы данных в Ultimate++, [https://web.archive.org/web/20110516132259/http://osa.samag.ru/get/OpenSource070.zip «Open Source» № 70]{{ref-pdf|2}}
** Часть 4: Графика в Ultimate++ и общие выводы [http://osa.samag.ru/get/OpenSource071.zip «Open Source» № 71]{{Недоступная ссылка|date=Май 2018 |bot=InternetArchiveBot }}{{ref-pdf|2}}
** Часть 4: Графика в Ultimate++ и общие выводы [http://osa.samag.ru/get/OpenSource071.zip «Open Source» № 71]{{Недоступная ссылка|date=2018|bot=InternetArchiveBot }}{{ref-pdf|2}}

{{Портал|Свободное программное обеспечение|}}

{{IDE}}
{{IDE}}
{{Инструментарии виджетов}}
{{Инструментарии виджетов}}

Текущая версия от 21:07, 17 июля 2024

Ultimate++
Логотип программы Ultimate++
Скриншот программы Ultimate++
Снимок U++ TheIDE (выбран редактор компоновок)
Тип Библиотека элементов интерфейса (виджетов), IDE
Разработчики Mirek Fídler, Iñaki Zabala, Tomáš Rylek, Daniel Kos, Massimo Del Fedele, Zbigniew Rębacz + участники проекта
Написана на C++
Операционная система Кроссплатформенный
Последняя версия 2022.2 (rev. 16270) (27 мая 2022)
Репозиторий sourceforge.net/projects…
Лицензия BSDL
Сайт ultimatepp.org

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

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

Особенности

[править | править код]

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

[править | править код]

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

В следующем примере создаётся (без использования визуального редактора) приложение с кнопкой «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();
}

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

[править | править код]

В разделе Comparisons официального сайта вы сможете найти примеры создания на U++ достаточно сложной формы и сравнить её с реализацией аналогичной функциональности на Qt, wxWidgets и Java/Swing.

Примечания

[править | править код]
  1. Working with Android builder. Дата обращения: 22 декабря 2019. Архивировано 22 декабря 2019 года.