Gui — С какой библиотеки начать изучение gui c++


Содержание

Программирование GUI С++ или С#

11 [2011-02-19 08:13:00]

Я беру занятия по программированию в университете. Я просто взял структуры данных, и я почти готов к разработке шаблонов. С классом шаблонов проектирования инструктор позволяет нам выбрать, какой язык использовать, и какую IDE использовать в наших лабораториях. Поскольку я знаю С++, я использовал это. Большинство классов использовали С#, а некоторые использовали java..

Ну, я только что подписался на графический интерфейс spring и его один и тот же учитель, и он сказал, что мы можем использовать все, что захотим. Поскольку, я никогда не использовал С#, возможно, лучше использовать С++? Я изучил использование QT4, но я не знаю, как это тяжело, и насколько это действительно помогает? Поскольку, там не будет много лекций.

Я рассматриваю использование С#, поскольку я взял классы в VB.NET и использовал winforms совсем немного. Однако, я бы хотел использовать С++, что вы думаете? Является ли С++ gui тем, что я могу использовать в будущем в реальном мире? или мне лучше попробовать учиться С# Я хотел бы придерживаться С++ в моей карьере, хотя.

Я не хочу задерживаться в обучении С# и графическом интерфейсе одновременно. Является ли QT4 хорошим способом?

c++ user-interface c#

8 ответов

21 Решение Dr Deo [2011-02-19 08:23:00]

qt не так сложно работать. Я пробовал некоторые комплекты инструментов gui для С++, и это мой опыт в плане С++

Для разработки С++ и gui я бы в подавляющем большинстве одобрил Qt вместо альтернативных библиотек, таких как win32 api, классы фундамента Microsoft и т.д.

Преимущества

  • qt является кросс-платформой и может использоваться для окон, linux, symbian, windows ce, mac osx
  • qt не так сложно учиться. Если вы понимаете основы классов С++ и некоторые шаблоны программирования
  • qt используется для профессионального создания guis. Я точно не помню, но я думаю, что autodesk maya и adobe photoshop могут использовать qt для своего gui’s
  • qt4 имеет больше, чем просто GUI-программирование, то есть он имеет библиотеки для сетей, интернационализации, фононов для видео и аудио, анимации и т.д. и т.д.

Недостатки

  • это не родная библиотека, поэтому ваше приложение будет больше, чем если бы вы использовали win32 api, но даже тогда я все еще думаю, что это меньше, чем время выполнения .net

Чтобы начать обучение qt сейчас

  • найти книгу программирования С++ gui с использованием qt4 второго издания. или другой хороший ресурс
  • скачать qt sdk для визуальной студии 2008
  • загрузите добавление visual studio qt для визуальной студии 2008
  • создайте новый проект qt4 и скомпилируйте и запустите свой первый проект

Я должен с самого начала заявить, что я не разработчик С#, но я знаю, что у него есть хорошие вещи.

Известные преимущества

  • позволяет использовать формы Windows, wpf, linq (языковой интегрированный запрос) и т.д.
  • wpf — это то, что вас больше всего интересует как разработчик С#

Недостатки

  • как и все языки .net, он все еще медленнее, чем собственные приложения, сделанные в С++
  • не переносится в разные операционные системы, такие как mac osx, linux (но помните, что САМЫЕ ПОЛЬЗОВАТЕЛИ (90%) ОСНОВАНЫ ОКНАМИ)
  • Если вы нацеливаете пользователей на windows xp, вам придется неудобно их загружать .net, чтобы ваше приложение работало. Для меня это самый большой недостаток языков .net, поскольку большинство пользователей, которых я знаю, имеют медленные интернет-соединения.

Чтобы начать изучение разработки gui с помощью С#

  • найдите открытую презентационную базу окон книги или любую хорошую книгу С#/wpf.

Предупреждение

  • Я не эксперт в С++ или С#, и просто даю свое мнение или опыт.
  • У меня ограниченный опыт работы в С#

5 Clifford [2011-02-19 10:54:00]

Я рассматриваю использование С#, поскольку я взял классы в VB.NET и использовал winforms совсем немного. Тем не менее, я бы хотел использовать С++, каковы ваши мысли?

Если вы хотите использовать Windows Forms и С++, тогда вы можете использовать С++/CLI (ранее известный как Managed С++). Это использует расширения для С++ для поддержки .NET и является единственным языком .NET, который позволяет использовать смешанный CLI и собственный код, поэтому, как только вы приклеиваете код интерфейса к вашему коду приложения, вы можете использовать только ISO С++.

Тем не менее, за исключением тех случаев, когда я реализую интерфейс для существующего кода на С++, мне было проще просто изучить С#, который разработан с нуля, чтобы быть языком .NET, поэтому он, как правило, гораздо удобнее.

В арене ISO С++ варианты включают Qt и WxWidgets, оба из которых являются кросс-платформенными и хорошо поддерживаются книгами и онлайновой информацией и сообществами.

Я использовал WxWidgets до (С++). Это легко и весело. Afaik, значительная часть дизайна пользовательского интерфейса выполняется с помощью редакторов дизайна или различных импортеров XML/LUA, поэтому набор инструментов, который вы используете, по сути, не имеет особого значения, потому что код, управляемый событиями, будет очень похож на почти все.


Учебники WxWidgets великолепны, и форумы полезны. Если вам интересно, как WxWidgets сравнивается с другими инструментами, у них есть отличная страница wiki, посвященная этому

Это зависит от того, что вы пытаетесь изучить.

Если вы хотите узнать, как работают библиотеки GUI, а не как их использовать, вы хотите посмотреть на простой Win32.

Если вы хотите узнать, как их использовать, вы обнаружите, что С# или VB с WinForms легче всего подбирать. И, конечно же, они позволяют использовать великолепного дизайнера.

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

1 JustinC [2011-02-19 16:42:00]

Как сказал @David Heffernan, не беспокойтесь о кросс-платформе, если вы не должны ее иметь (преждевременная оптимизация). Существует плата за такую ​​гибкость, которую предлагают большинство наборов кроссплатформенных платформ. Кроме того, благодаря моему многолетнему опыту как разработчика, так и пользователя, инструментальные средства для собственных плат обычно предлагают лучший опыт работы с конечным пользователем (часто меньше сюрпризов о том, что и как пользователю разрешено и не разрешено делать с каждым элементом управления или поверхностью).

В учебной среде вы хотите рассмотреть, что вы надеетесь выполнить в семестре. Типичный трехмесячный график семестра с последующими вехами предполагает, что вам понадобятся низкие трения. Изучение библиотеки gui может стать отличным достижением, но вы, вероятно, захотите познакомиться с по крайней мере средой или контекстом, прежде чем приступить к работе, чтобы своевременно завершить промежуточные задания: предположительно взаимодействия и вообще общий пользовательский интерфейс лежат в основе фокуса класса.

По этим причинам я бы подумал о том, чтобы придерживаться С++, поскольку у вас есть смысл для парадигмы и основ языка и инструментов. Но, поскольку это учебная среда, я бы сильно подумал о чем-то менее распространенном, но созрел с потенциалом в библиотеке. Я мог бы посмотреть на аппаратные ускоренные библиотеки окон, либо на основе xgl, либо на OpenGl, если они нацелены на unix/linux или Windows Presentation Foundation, если они предназначены для Windows.

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

Следовательно, для любого проекта это зависит только от ваших предпочтений. Как правило, разработка пользовательского интерфейса с использованием .NET проще из-за фантастической поддержки RAD, предоставляемой Visual Studio, которая, к сожалению, не обеспечивает такого уровня сложности для проектов на С++.

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

Следовательно, если вы действительно хотите программировать пользовательский интерфейс на всех платформах; то С++ — лучший выбор (конечно, в эти дни у вас есть Mono, но не уверен, есть ли у них инструментарий на основе QT, на который вы смотрите).

Довольно глоток — но сделать это коротко: Это все о вашем выборе и обучении. Если вы хотите изучить С# и использовать его, продолжайте. Но если вам нравится С++, вы все равно можете использовать его, и в С# ничего не может быть сделано, но не может быть выполнено с помощью С++.

Ну, я не мог бы дать лучший ответ, чем Dr.Deo, но я могу поделиться своим домом. Раньше я делал много графического программирования (более 5 лет назад, с Borland VCL в Delphi или С++). Недавно мне пришлось создать графический интерфейс для небольшого проекта, поэтому я пошел на Qt4. Я смог почти полностью завершить графический интерфейс за один день без предварительного знания Qt4 (конечно, это был простой графический интерфейс с одним окном). Я нашел его очень простым в использовании и быстрому обучению. Если у вас есть какой-либо GUI-опыт, он будет очень интуитивным. Что касается знания С++, то оно минимальное. Вы должны быть довольны справедливой дозой наследования и полиморфизма, но это очень характерно для инструментов GUI, и это действительно просто базовое знание ООП на С++.

Я думаю, что некоторые люди уже говорили о том, чтобы быть кросс-платформенными. Это будет все более и более важным в будущем, поскольку альтернативы Windows становятся основными (в основном, все люди, с которыми я работаю, либо имеют Mac, либо используют дистрибутив Linux), и поскольку появляется больше продуктов между телефоном и планшетным ПК.

И, в любом случае, язык, который вы используете для программирования графического интерфейса, на самом деле не так важен, это набор инструментов. Я думаю, Qt4 очень полна. Это также избавит вас от необходимости взаимодействовать с вашим существующим кодом (не говоря уже о обучении С#). Наконец, Qt4 очень удобно использовать с любой системой IDE или сборки (если вы не хотите переключать свой код на qmake и/или Qt-Creator).

-3 John [2011-02-19 08:21:00]

Для программирования графического интерфейса вы можете использовать Visual С++.

Трудно закодировать все в VС++, чтобы люди шли на MFC. MFC обеспечивает 100 классов, которые значительно облегчают жизнь. Итак, все, что вам нужно сделать, это изучить основы VС++ и изучить MFC.

KNZSOFT Разработка ПО, консультации, учебные материалы

Князев Алексей Александрович. Независимый программист и консультант.

Qt для начинающих. Урок 1. Простейшее GUI-приложение и основные виджеты

Вернуться к общему содержанию «Qt для начинающих».

Чтобы первый урок был более интересным, построем его на ряде примеров с пояснениями.

Простой пример для ручной сборки

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

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

В строках 01 и 02 выполняется включение заголовочных файлов QApplication и QWidget, в которых, кроме прочего, содержится объявление классов QApplication и QWidget. В нашем примере мы создаем экземпляры этих классов.

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

В данном примере, класс QApplication интересует нас как организатор цикла сбора сообщений, которые будут приходить в окно нашего GUI-приложения. См. строку 11 (запуск цикла обработки оконных сообщений). Класс QApplication реализован по подобию синглтона (Singleton). Для тех, кто не знаком с этим термином из теории шаблонов проектирования (или, паттернов, от англ. patterns) дадим небольшое пояснение. Суть синглтона заключается в том, что реализация класса предотвращает возможность создания более одного экземпляра данного класса. Эта особенность нам важна потому, что из нее следует возможность определения внутри библиотеки Qt глобальной переменной с указателем на единственный экземпляр данного класса. Смотрите описание для символа qApp в справке Qt.

В библиотеке Qt используется терминология виджета (от англ. widget — штуковина, приспособление), как элемента GUI-интерфейса. Минимальный общий набор свойств таких элементов представлен классом QWidget.

В строках 06 и 07 создаются объекты классов приложения и виджета. В обоих случаях выполняется статическое создание объектов. Время существования таких объектов ограничивается операторным блоком < … >в котором они созданы. Как только исполнение кода программы дойдет до закрывающей скобки, то оба этих объекта автоматически уничтожатся. Таким образом, в данном примере мы не будет задумываться о способе уничтожения объектов Qt и рассмотрим этот вопрос позже.

При создании объекта QApplication используется параметризованный конструктор в который передаются аргументы запуска приложения (копируются из аргументов функции main()). Внутри объекта класса выполняется парсинг этих аргументов. Класс приложения поддерживает ряд параметры запуска, которые можно уточнить по справке для соответствующего конструктора QApplication. Параметры запуска не входящие в этот список следует анализировать самостоятельно. В конце этого урока, разместив в главном окне приложения несколько элементов управления мы предложим провести эксперимент с параметром запуска -style, для которого, в любой сборке Qt, возможны значения: motif, windows, platinum.

В строке 08 выполняется изменение одного из атрибутов объекта виджета. С помощью метода setWindowTitle() мы устанавливаем свой текст для заголовка нашего будущего окна. Обратите внимание, что изображение строки обернуто вызовом функции трансляции tr(). Это требование интернационализации приложения. По всем подобным оберткам, специальными средствами Qt, могут быть созданы специальные файлы с переводами на разные языки, которые можно будет использовать в приложении для выполнения автоматических замен. Обычно, такие файлы включают в сборку приложения в виде ресурсов.

В строке 10 выполняется открытие окна приложения. До версии Qt4, перед открытием окна выполнялась явное объявление виджета как главного виджета приложения. Это делалось с помощью следующего кода.

Начиная с версии Qt4 выполнение такой связи выполняется автоматически через обращение к глобальному указателю qApp на экземпляр класса приложения.

В строке 11 выполняется запуск цикла обработки сообщений операционной системы направленный в окно приложения. Цикл завершается при выполнении какой-нибудь из команд закрытия приложения. Код закрытия приложения возвращается методом exec() при завершении метода. Именно этот код становится кодом возврата функции main() за счет передачи его через оператор return.

Теперь попробуем выполнить сборку приложения. Проще всего это будет сделать в Linux. Для этого надо будет просто открыть консоль и выполнить некоторые команды, которые мы сейчас опишем. Для Windows такая работа может потребовать установку путей на директории размещения утилиты qmake из Qt SDK. Данная утилита реализует правила системы сборки проектов QMake.

Для начала следует узнать, что нам доступно из консоли. Если мы в консоли bash (*nix), то сделать это достаточно просто. Наберите команду qmake и нажмите два раза табуляцию. Мы должны увидеть список всех команд, которые начинаются с сочетания qmake. Например, в моем случае я вижу две команды: qmake и qmake-qt4. Это говорит о том, что у меня из репозитория установлены две версии библиотеки. Команда qmake соответствует версии Qt5 (действует умолчание для последней версии), а команда qmake-qt4 соответствует, соответственно Qt4. Теперь, в зависимости от того, какой командой я воспользуюсь, я буду делать сборку либо с использованием версии Qt5, либо с использованием версии Qt4.

Цукерберг рекомендует:  Факультатив по JS React-разработке от Альфа-Банка

Если все у нас в системе настроено нормально и версии Qt SDK удачные, то сборка проекта должна быть выполнена с помощью следующих трех команд.

С помощью первой команды будет создан проектный файл. Проектный файл имеет суффикс .pro. В контексте Windows правильно будет сказать «расширение pro«. Понятия суффикс имени файла и расширение файла означают совершенно разные вещи, хотя и кажутся похожими. Следите за правильностью употребления.

Вторая команда должна создать файл сценария компиляции — Makefile. Третья команда должна выполнить сценарий компиляции, в результате которого должен получиться исполняемый файл приложения.

Если этого не произошло, то попробуем найти проблему.

Откройте проектный файл. Попробуйте найти там следующую строку.

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

Следует иметь в виду, что если вы имеете дело с Qt SDK версии 5, то данное определение должно еще включать группу widgets, как показано ниже.

Пример создания шаблона GUI-приложения из QtCreator

Откройте QtCreator. Для создания нового проекта запустим мастер создания проекта из меню «File->New File or Project …». В открывшемся окне первой страницы мастера предлагается выбрать шаблон будущего проекта. Для группы проектов «Application» выберем вариант «Qt GUI Application» и щелкнем по кнопке «Choose» для перехода на следующую страницу мастера.

На второй странице мастера создания проекта предлагается выбрать имя проекта и директорию его размещения. По указанному имени проекта будет создана поддиректория в которой будут размещены файлы проекта. Создание поддиректории будет выполнено в указанной директории размещения. Таким образом, имя проекта должно определяться правилами которым должно подчиняться имя директории. Однако, чтобы избежать проблем, не используйте русских букв и пробелов. Используйте английские буквы, цифры и символы подчеркивания и тире (знак минуса). Пусть наш проект будет называться app1. Запишем его в строку name, а в строке выбора директории проекта укажем директорию, где и в дальшейшем будем создавать проекты на Qt. Следует избегать путей с русскими буквами и пробелами. Рано или поздно, они могут вызвать проблемы. Если необходимо запомнить этот путь для следующего раза, установите флажок «Use as default project location». Щелкнем по кнопке «Next» для перехода на следующую страницу мастера.

На третьей странице мастера создания проекта предлагается выбрать Qt SDK из списка найденных и зарегистрированных в QtCreator. Выберите вариант Qt4. Для выбранной версии SDK, следует определить профили сборки проекта. Предлагаются варианты «Release» и «Debug» Сборка «Release» не содержит отладочных символов в исполняемом файле и рекомендуется для передаче в реальное использование. Во всех остальных случаях, удобнее использовать сборку «Debug». В текущем примере, выбор сборки не имеет значения. Можно оставить включенным оба профиля. Справа от названия профиля расположено поле ввода в котором записан путь по которому будет выполняться соответствующая сборка. Часто эти пути редактируют исходя из разных традиций. В нашем примере мы можем оставить эти пути без изменений. Щелкнем по кнопке «Next» для перехода на следующую страницу мастера.

На четвертой странице мастера создания проекта предлагается выбрать имя класса для главной формы проекта, базовый класс, от которого следует унаследовать главную форму проекта и имена файлов, где будет размещен интерфейс и реализация создаваемого класса главной формы. Кроме этого, на странице следует указать будет ли использовано визуальное проектирование формы. Так как мы не будем использовать визуальное проектирование, то следует проследить, чтобы флажок «Generate form» был снят.

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

  1. QMainWindow — в большинстве случаев, наиболее подходящий выбор. Наследуясь от данного класса мы получаем уже готовые средства для размещения меню, строки статуса и центрального поля, которое можно реализовать как в стиле SDI (Single Document Interface), так и в стиле MDI (Multi Document Interface).
  2. QWidget — этот класс является простейшим виджетом. В терминологии Qt это простейший элемент, с которым связана какая-то графическая область на экране. Как базовый класс для главного окна, используется, как правило, при создании простых одноформенных приложений и отлично подходит для начальных «ученических» целей по причине того, что не содержит ничего «лишнего».
  3. QDialog — базовый класс для создания модальных диалоговых окон.


Для нашего примера, выберем в качестве базового класса, простейший вариант — QWidget. Имена для главного класса формы и для файлов, где будет размещаться его интерфейс и реализация можно оставить значениями по-умолчанию. Щелкнем по кнопке «Next» для перехода на следующую страницу мастера.

Пятая страница мастера создания проекта позволяет определить связь создаваемого проекта с уже открытыми проектами и указать выбор какой-нибудь доступной системы управления версиями проекта. В текущем примере нас не интересуют данные возможности, поэтому нам следует завершить работу мастера щелкнув кнопку «Finish».

В разных версиях QtCreator шаги по созданию проекта могут несколько отличаться, но, по сути, здесь изложены главные моменты, которые следует понимать при создании GUI-проекта. Текущее описание делалось на основе версии QtCreator 2.7.0.

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

QtCreator заметно отличается своим дизайном от других сред разработки. Однако, его дизайн удивительно эргономичен. Кроме прочего, в эпоху широких экранов, очень выгодно смотрится панель инструментов расположенная слева в главном окне среды разработки. В нижней части панели инструментов, как уже говорилось, расположены кнопки запуска приложения, а в верхней — кнопки выбора вкладок для главного окна среды разработки. Рассмотрим список основных вкладок.

  • «Welcome» — Выбор проекта
  • «Edit» — Редактирование программы.
  • «Debug» — Отладки проекта. Включает необходимые окна для наблюдения за объектами.
  • «Projects» — Настроки проектов, загруженных в среду разработки. Следует внимательно изучить возможности представленные на этой вкладке
  • «Analyze» — Анализ проектов с помощью специальных средств обнаружения узких мест в быстродействии и проблем утечки памяти.
  • «Help» Окно интергрированной справки. Возможно, вам больше понравится работать с отдельным справочным приложением QtAssistant.

Простой пример размещения виджетов в окне приложения

Возьмем проект, который мы создали в предыдущем разделе с помощью мастера среды разработки QtCreator. Созданный проект включает в себя следующие файлы.

  • app1.pro — файл проекта
  • main.cpp
  • w > Возможно, имена файлов в вашем проекте несколько отличаются. Это может быть либо потому, что вы их явно указали другими, при создании проекта, либо значения по умолчанию для вашей версии QtCreator иные.

Откроем файл реализации главного окна приложения — widget.cpp. Изменим его до состояния представленного в следующем примере. Помните, что номера строк указаны только для удобства комментариев.

В строках 01-03 выполняется включение файлов с интерфесами следующих классов виджетов.

  1. QLabel — класс метки. Часто используется для размещения статической текстовой информации. Понимает некоторые теги HTML для форматирования. Может быть использован для статического размещения изображения. Например, из файла с картинкой. Наследуется от QFrame, поэтому может настраиваться на различные формы окантовки (бордюра).
  2. QLineEdit — класс для создания однострочных полей ввода текстовой информации.
  3. QPushButton — класс кнопки. Чаще всего используется для обработки сигнала clicked() — щелчок по кнопке.

Тело конструктора класса Widget содержит две строки настройки атрибутов окна (строки 10-11) и 8 строк создания и размещения на поле окна трех других виджетов (строки 13-20).

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

Строка 13 содержит создание экземпляра класса QLabel. Объект создается динамически, через оператор new. Для создания объекта используется конструктор, первым параметром которого указывается строка, которую должен изображать создаваемый объект. Вторым параметром данного конструктора следует указать адрес объекта, который станет владельцем создаваемого объекта метки. В качестве адреса владельца указано значение this. По правилам языка C++, this является указателем на объект внутри которого он используется. Т.е., в данном контексте, это указатель на созданный экземпляр класса Widget. Таким образом, в строке 13 создается объект класса метки, который должен изображать указанный текст и владельцем которого назначается текущий объект.

Здесь пришло время рассказать о цепях владения, которые реализованы в системе классов Qt для решения проблемы уничтожения объектов для предотвращения случайных утечек памяти. Следует вспомнить, что объекты созданные динамически, т.е. с помощью оператора new, размещаются в специальной области памяти, называемой кучей (heap) и которые живут в куче до тех пор пока не будут явно уничтожены оператором delete. Если программист не отслеживает уничтожение объектов, которые стали ненужными и не вызывает для их уничтожения оператор delete, то это становится причиной утечки памяти в приложении, которая является серьезной проблемой для ряда языков программирования в группу которых входит язык C++.

Существует несколько известных схем автоматического слежения за уничтожением динамически созданных объектов. Один из них заключается в использовании умных указателей, о которых, следует рассказать позже. Другой способ заключается в создании цепей владения, о котором мы сейчас расскажем. Третьим способом является создание подсистемы уборки мусора, которая должна отлеживать ненужные объекты и уничтожать их. Последний способ, традиционный для ядер многих современных языков, в C++ практически не используется. Гораздо более популярными в традициях языка C++ являются первые два способа.

Итак, цепи владения реализуют следующую простую идею. Создается некоторый объект, за уничтожением которого мы обязуемся следить. Проще всего создать такой объект статическим определением и тогда он уничтожится автоматически, когда исполнение программы достигнет конца операторного блока < … >в котором он был определен. Далее, при динамическом создании других объектов будем назначать для них объекты владельцев. В обязанности владельцев будет входить уничтожении владеемых объектов в теле собственного деструктора. Напомним, что деструктор — это особый метод, который вызывается при уничтожении объекта. Таким образом, можно построить такую цепь владения относительно первого объекта, все элементы которой будут автоматически уничтожены при уничтожении первого объекта. При организации такой схемы следует лишь правильно учитывать время жизни объекта, который назначается владельцем другого объекта, чтобы объекты не были уничтожены преждевременно.

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

При реализации схем цепей владения, в некоторых библиотеках используется параметр с именем owner, что с английского языка переводится как владелец. Однако в библиотеке Qt такой параметр называется parent, что переводится с английского как родитель. В результате этого, у некоторых новичков возникает недопонимание образованное тем, что понятие «родитель» традиционо относится к цепям наследования в ООП, однако цепи наследования и цепи владения не имеют ничего общего. Будьте внимательны и не становитесь жертвой заблуждения в этом вопросе.

Вернемся еще раз к строке 13. Там мы создали объект владельцем которого назначен текущий объект главного окна приложения. Переменная plb, которая хранит адрес созданного объекта будет уничтожена автоматически при достижении конца кода конструктора. Однако объект который был распределен в памяти останется жить и далее, и будет жить до тех пор, пока объект главного окна приложения не будет уничтожен. При уничтожении объекта главного окна будут автоматически уничтожены все объекты, которыми объект окна владеет.

В строке 14 мы обращаемся к методу задания атрибутов геометрии, которые определяют размещение настраиваемого объекта относительно своего владельца. Первым и вторым значением указываются горизонтальная и вертикальная координата для верхнего левого угла объекта. Третьим и четвертым значением указывается ширина и высота настраиваемого объекта.

Аналогичным образом, далее, создаются и настраиваются объекты однострочного поля ввода и кнопки.

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

Используя данное приложение можно поэкспериментировать с параметрами запуска приложения. Проще всего это сделать в консоли. Зайдите в директорию сборки приложения и выполните следующие варианты запуска приложения с параметрами. В каждом из запусков должна быть заметна разница в стиле прорисовки виджетов.

В данном примере, исполняемый файл приложения указан именем app1. Возможно, что в вашем случае, исполняемый файл имеет другое имя. В операционной системе Windows, исполняемые файлы имеют расширение exe. Кроме того, в операционной системе Windows, выполнить запуск исполняемого файла из текущей директории можно без указания относительного пути, т.е. без указания (./) — символ точки является синонимом текущей директории, а символ прямого слеша — символом разделителя в записи файловых путей. Также, следует иметь в виду, что символ доллара — это символ стандартного приглашения в консоли *nix для обычного пользователя и набирать его частью команды не нужно. В консоли Windows, символом приглашения обычно является символ угловой скобки (>).

Параметры запуска, также можно указать при запуске приложения из среды разработки QtCreator. Для этого щелкните на панели инструментов слева по значку Projects. Откроется соответствующая вкладка с настройками. В верхней части окна можно видеть иерархическую систему вкладок. Вкладки самого верхнего уровня определяют проект, так как в среде разработки могут быть открыты несколько проектов. Следующий уровень вкладок, кроме прочего, должен содержать вкладку Build&Run, которая нам нужна. В этой вкладке далее следует выбор версии Qt SDK, для случая, если вы делаете сборку проекта сразу под несколько версий. Если вы собираете проект под одну версию, то выбор будет состоять из одного элемента. Внутри виджета выбора версии Qt SDK, расположены две стилизованные кнопки с закругленными краями — кнопки Build и Run. Щелкните по кнопке Run, чтобы выбрать соответствующую группу настроек. Там, в одноименной группе параметров Run вы найдете однострочное поле ввода напротив метки Arguments. Это и есть конечная цель нашего выбора. Запишем туда следующую строку.

Запустите приложение. Потом попробуйте другие значения: windows и platinum. Напомним, что объект класса QApplication поддерживает список из пары десятков параметров запуска, о которых можно прочитать в справке по соответствующим конструкторам класса.

Работая над примером, познакомьтесь со справочной информацией по используемым в примере классам. Попробуйте добавить на форму другие экземпляры классов метки, однострочного поля ввода и кнопки. Кроме этого, попробуйте познакомиться со справкой и добавить на форму объекты следующих классов.

  1. QComboBox — класс выпадающего списка.
  2. QCheckBox — класс флажка (чекера).
  3. QTextEdit — класс многострочного поля ввода. Используется как для редактирования, так и для представления текста. Содержит очень богатые возможности по представлению документов за счет выделения функций специальных компоновщиков документов в отдельные классы.

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

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

3 библиотеки для создания графического интерфейса пользователя (GUI)

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

В Python начать GUI программирование просто, но первый шаг – это выбор пакета для создания GUI. К счастью, у программистов, которые хотят создать простой способ взаимодействия пользователей с их программами, есть много вариантов.

Но прежде всего задумайтесь: действительно ли нужно, чтобы ваше приложение имело традиционный графический интерфейс пользователя вообще? Для некоторых программ ответ очевиден. Если ваше приложение по своей природе графическое или будет запускаться локально на одной машине, то да, вам, вероятно, следует создать десктопный интерфейс. Часто это становится очевидным исходя из того, что вы проектируете.

Но для более общих программ, не сбрасывайте со счетов командную строку или веб-интерфейс.
Командная строка обладает многими преимуществами: скоростью, удаленным доступом, возможностью повторного использования, возможностью записи сценариев и контролем, что может быть более важным для пользователей вашего приложения, чем графический интерфейс, и существует множество библиотек, таких как, например, Click, Cement и Cliff, которые помогают создать великолепные программы командной строки.

То же самое с веб-интерфейсом. Даже для программы, предназначенной для локального запуска, это может быть решением – особенно, если есть вероятность, что пользователи могут разместить ваше приложение удаленно, а такие проекты, как Django, Flask или Pyramid, делают это просто.
Можно даже использовать библиотеку наподобие pywebview, чтобы обернуть веб-приложение в более естественное окно GUI.

Или еще можно использовать фреймворк Pyforms для создания единообразного представления в Интернете, командной строке и на рабочем столе, и это все на базе одного кода.

Все еще уверены, что хотите построить графический интерфейс? Отлично, вот три фантастических библиотеки с открытым исходным кодом.

PyQt реализует популярную библиотеку Qt. Вы, возможно, уже знакомы с Qt – вы могли работать с Qt на другом языке. PyQt позволяет разрабатывать приложения на Python, и в то же время пользоваться инструментами и знаниями большого сообщества Qt.

PyQt имеет два вида лицензии – коммерческую и лицензию GPL, в отличие от самого проекта Qt.

Tkinter

Если бы был один пакет, который можно было бы назвать «стандартным» инструментарием GUI для Python, это был бы Tkinter. Tkinter – это оболочка вокруг Tcl / Tk, впервые появившегося в начале 90-х годов. Преимущество Tkinter – огромное количество ресурсов, включая книги и примеры кода, а также большое сообщество пользователей, которые могут помочь, если у вас есть вопросы. Примеры просты и понятны для новичка.

Tkinter доступен под лицензией Python, поверх лицензии BSD Tcl / Tk.

WxPython

WxPython переносит кросс-платформенную графическую библиотеку wxWidgets с родного языка C ++ на Python. WxPython – это немного более современный подход, который выглядит более натуральным, в разных операционных системах, чем, например, Tkinter, потому что он не пытается создать свой собственный набор виджетов (хотя они могут быть тематически похожими на его исходные компоненты). Он тоже прост в освоении, и сообщество разработчиков на WxPython посоянно растет.

WxPython использует wxWindows Library License своего родительского проекта, который одобрен OSI.

Это, конечно, не все доступные варианты. Десятки других опций есть на странице «Программирование GUI на Python» на официальной вики-странице Python Software Foundation.

А если захочется что-нибудь сделать что-нибудь не похожее на традиционное рабочее окно – например видео игру, то для этого в Python тоже есть хорошие библиотеки – например, pygame и pyglet.

Тема: Обзор GUI библиотек для C++

Опции темы


Отображение
  • Линейный вид
  • Комбинированный вид
  • Древовидный вид

Обзор GUI библиотек для C++

Вот, обзор GUI библиотек для C++ от меня, всё из личного опыта.
Ну что, поехали. Участие примут:
Qt
wxWigets
WTL
MFC

Qt
Qt — уже даже не просто библиотека для лёгкого и красивого GUI, это уже целый фреймворк, содержаший в себе всё что нужно для жизни, начиная от более высокоуровенной прослойки OpenGL до работы с базами данных.
Плюсы:
— Сигналы и слоты.
— «Всё включено».
— Удобство.
— Минимальное использование шаблонов.
— Поддержка HTML5 и CSS3.
— Кросплатформенность.

Минусы:
— Размер.
— На слабых машинах при развороте окна иногда бывают заметны подтармаживания.
— MOC-компилятор.

wxWigets
wxWigets имеет необычную особенность: GUI реализует на API системы, но при этом полностью кроссплатформенна.
Плюсы:
— Библиотека сравнительно небольшая.
— Кросплатформенность.

Минусы:
— Слабая, для многих классов даже отсутствующая документация.
— Сырость.

WTL
WTL — шаблонная библиотека, разрабатываемая на базе ATL как замена MFC, когда было понятно что этот проект уже полностью завален. Особенность — самая маленькая из всех и не требующая таскать с собой .dll.
Плюсы:
— Удобство.
— Поддержка Aero.
— Маленький вес, не требует таскать с собой dll.
— Гибкость.

Минусы:
— Windows only.
— Не так далеко от WinAPI.
— COM.

MFC
MFC — попытка Microsoft облегчить жизнь кодеров за счёт создания оболочки для WinAPI и дополнения её всевозможными плюшками.
Плюсы:
— Небольшое, да ускорение разработки.
— Относительная лёгкость.

Минусы:
— Windows only.
— Не более чем пару классов-обёрток над WinAPI.
— Несмотря на свою мелочность весит с сконфигурированную Qt в полном составе и работает куда медленнее.
— Отлаживать получающиеся поделия — пытка.
— Кривость-косость как в архитектуре так и в реализации.

В будущем постараюсь дополнить.

WxW > Рубрика: Линукс

Для разработки и реализации графического пользовательского интерфейса (GUI) в настоящее время существуют разные инструменты. Как правило, такие инструменты представляют собой фреймворк (библиотека специализированных программных инструментов), для функционирования и использования которого необходима соответствующая среда рабочего окружения. Такая ситуация например, с окружением JRE для написания GUI на Java. Примерно то же самое и с .Net – огромный неповоротливый фреймворк. В итоге, многие программисты задумываются над поиском более независимого, лёгкого и универсального инструмента. Желательно такого, чтобы для запуска и работы приложений на его основе не нужно было его «носить с собой». Именно такой альтернативой и является библиотека wxWidgets. В данной статье будут рассмотрены основные возможности этой библиотеки, а также её сборка для Linux-систем.

Почему именно wxWidgets?

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

Фреймворк .Net довольно тяжёл. Производительность приложений на основе .Net оставляет желать лучшего. Совместимость с UNIX-подобными системами для него также является проблемой. И это направление в виде платформы Mono представляется далеко не самым перспективным.

Qt-фреймворк, основанный на C++, хоть и является более быстрым и переносимым по сравнению с .Net, однако не совсем ясна ситуация с его лицензией. Существует открытая и коммерческая лицензии этого инструментария. Что, очевидно, налагает некоторые ограничения на использование свободной его версии. Иначе бы параллельно не существовало коммерческой ветки с более широкими возможностями. Этот факт также заставляет сомневаться относительно перспектив проектов на Qt. В техническом же отношении, этот фреймворк не обеспечивает полноценный нативный внешний вид приложений. Контроллы и элементы управления выглядят несколько иначе, нежели отрисовываемые средствами WinAPI в Windows или на GTK в UNIX-системах. Зачастую, это смущает и отпугивает пользователей.

Приложения на Java работают как минимум в полтора раза медленнее, чем на C/C++. Это далеко не секрет. Так же, как и то, что приложения, созданные на основе Java-апплетов внешне никак не вписываются в нативный стиль оформления ни одной из платформ. Пользователям не нравится работать с необычно и даже коряво выглядящими элементами интерфейса Java-приложений. При этом, как и в случае с .Net, необходимо всюду, на любой используемой платформе иметь установленную среду JRE для работы Java-апплетов. Именно такая возня и отталкивает многих разработчиков от использования Java.

Практически всех вышеперечисленных недостатков лишена wxWidgets – абсолютно открытая и свободная библиотека, которая способна отрисовывать GUI с помощью API платформы. Это значит, что окна приложений на wxWidgets и элементы интерфейса выглядят стандартно, гармонично вписываясь в оформление рабочего стола используемой платформы. При этом скорость работы и производительность таких приложений действительно впечатляет. Сама же библиотека написана на C++ и представляет собой набор классов, реализующих весь функционал библиотеки. Эти классы подключаются к проектам и используются как базовые, для создания приложений. Основными преимуществами wxWidgets над другими аналогами являются:

  • быстродействие и производительность, ведь инструкции о рисовании элементов интерфейса транслируются непосредственно к стандартному API платформы без каких-либо промежуточных программных интерфейсов и сред;
  • отсутствие обязательной предустановки wxWidgets – просто собрал и используй, подключая заголовочные файлы и файлы библиотек к проекту;
  • сравнительно небольшой размер собранных приложений, даже при их статической линковке;
  • быстрое создание GUI вручную из кода, без использования RAD-утилит, которые, кстати, для wxWidgets тоже существуют, например wxSmith в Code::Blocks IDE, wxFormBuilder или wxCrafter в CodeLite IDE.

Стоит еще раз обратить внимание на то, как wxWidgets рисует элементы управления интерфейса. Приложение, написанное на wxWidgets, которое скомпилировано в Windows, будет отображаться стандартными средствами WinAPI. Код того же самого приложения, без каких-либо изменений, но скомпилированный под UNIX будет рисоваться также стандартными средствами, т. е. на GTK. Можно даже собрать GUI на wxWidgets так, что оно будет использовать самый, что ни на есть чистейший X11. И это без изменения кода. Вот, что такое по-настоящему качественная переносимость.

Кроме богатых возможностей создания GUI wxWidgets имеет и ряд других функций, таких как работа с сокетами, регулярными выражениями, работа с базами данных (БД), HTTP-сервер, клиенты HTTP и FTP обработка XML и полноценная поддержка графических библиотек, таких как OpenGL.

Казалось бы, почему при всех своих достоинствах, wxWidgets практически непопулярен? Во-первых, это проект, который начинался всего одним человеком. В 1992 году над ним начал работать его создатель — Джулиан Смарт. Он и в настоящее время занимается поддержкой wxWidgets, но уже в составе небольшой группы. Таким образом, wxWidgets – это продукт творчества, а не коммерческий проект, над которым работает армия программистов и который продвигается благодаря рекламным кампаниям. Это и есть главный недостаток wxWidgets. И как следствие — небольшое количество обучающих и поддерживающих ресурсов. Основными из которых являются официальный ресурс вики, а также форумы сообщества.

Примеры приложений, созданных на wxWidgets

Несмотря на не самую выдающуюся популярность, приложений на основе wxWidgets достаточно много. Среди таковых, кстати, есть и снискавшие уважение пользователей, например Code::Blocks IDE:

Рис. 1: Среда разработки Code::Blocks IDE в Windows 7.

Существует также ещё одна IDE, подобная Code::Blocks. Но с более изящным оформлением, удобным функционалом и несколько более дружественным GUI – это CodeLite:
Графический интерфейс популярного кроссплатформенного FTP-клиента FileZilla также написан на wxWidgets:
Популярным бесплатным звуковым редактором, доступным для всех платформ является Audacity, который, как можно догадаться, для отображения GUI использует библиотеку wxWidgets:

Рис. 2: Кроссплатформенная среда разработки CodeLite IDE в KDE.

Сборка wxWidgets под Linux

Для своей компиляции библиотека wxWidgets не требует сторонних или дополнительных зависимостей. Для начала нужно скачать архив с исходными текстами библиотеки:

Распаковка загруженного архива:

Содержимое архива будет распаковано в поддиректорию wxWidgets-3.0.4 текущего каталога. Теперь нужно перейти в каталог с исходниками и создать в нём директорию для сборки, например gtk-build:

Далее, необходимо сконфигурировать будущую сборку, выполнив скрипт конфигурации, передав ему необходимые параметры:

Назначение указанных параметров следующее:

  • –-with-gtk3 — включение поддержки GTK версии 3;
  • –-disable-shared — включение статической линковки, при которой библиотеки wxW >Приведённый перечень параметров сборки является наиболее универсальным и позволяет создавать практически любые приложения на wxWidgets. В результате вывод команды (несколько последних строк) configure должен быть примерно таким:

Если сборка завершилась ошибкой установите необходимые пакеты и библиотеки, например в убунту

Теперь можно приступить непосредственно к сборке:

Здесь ключ -j — это количество потоков для одновременной обработки нескольких задач сборки. В случае, когда используется 8-ядерный/16-поточный процессор, такой как например, AMD Ryzen 7 2700, можно указать -j16. Чем больше потоков, тем быстрее сборка.

Далее, после окончания сборки, самое время установить готовую библиотеку wxWidgets:

В результате файлы библиотеки и файлы заголовков будут скопированы в соответствии с указанным на этапе конфигурирования, в параметре —prefix значением — в /opt/wxwidgets-gtk3/ . Если нужно, чтобы библиотека устанавливалась там же, где и была собрана, то следует задать —prefix=$(pwd) .

Далее, для удобства можно установить переменную окружения, чтобы использовать служебную команду wx-config, добавив в файл

/.bashrc строку, перезапустив после этого сеанс пользователя:

Проверка, что всё работает:

Команда ws-config используется для определения путей подключения заголовочных файлов и библиотек. Которые необходимы для указания компилятору и линковщику. Так, например, для того, чтобы скомпилировать проект на wxWidgets. Необходимо передать компилятору то, что возвращает команда wx-config:

Здесь параметры «—cxxflags» и «—libs» указывают, что команда wx-config должна возвратить требуемый для удачной сборки набор флагов компилятора и пути подключения заголовочных файлов и библиотек wxWidgets.

Заключение


В заключение важно заметить, что библиотека wxWidgets поставляется в готовом виде практически в любом из дистрибутивов Linux. Однако далеко не всегда это универсальные сборки. Часто бывает, особенно это касается сложных проектов, что необходимо пересобрать wxWidgets с нужными параметрами. Задействовав таким образом дополнительные возможности, которых нет в стандартной сборке из репозитория дистрибутива. Для того, чтобы узнать, какие параметры сборки и возможности доступны, нужно выполнить команду ../configure —help в каталоге сборки wxWidgets. В результате будет выведен список доступных параметров и их назначение.

Как можно видеть, wxWidgets – это действительно универсальная и по-настоящему кроссплатформенная библиотека. Которая является достойным (если не самым лучшим) выбором для создания быстрых и платформонезависимых приложений любой сложности и направленности.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

5 кроссплатформенных библиотек для разработки GUI на C++

C++, как и Python и многие другие языки программирования, поставляются без встроенных инструментов построения графического интерфейса пользователя. Так было и до середины 80-х, когда операционные системы для PC разрабатывались без этого типа интерфейсов, и даже после того, как Windows и различные операционные системы от Apple стали нормой, и событийно-ориентированному программированию потребовалось несколько дополнительных лет, чтобы наверстать упущенное.

Тридцать лет назад весь ввод/вывод был сделан на символьных дисплеях. Так было до начала 90-х, когда появились первые графические библиотеки. С тех пор Mac OS (и в меньшей степени Linux) выросла по важности по сравнению с Windows, что делает более привлекательными инвестиции в создание программного обеспечения, которое может работать на всех трех платформах без необходимости переписывать код

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

Вам может никогда не понадобиться портировать ваше Windows приложение на Mac или Linux, но, по крайней мере, вы будете знать, что можете сделать это. В этом списке мы рассмотрим пять кроссплатформенных инструментов разработки GUI, которые написаны на C++ и все еще находятся в стадии активного развития. Пятерка, которую я выбрал, это Qt, wxWidgets, JUCE, CEGUI и CEF (некоторые другие, особенно GTK, MFC и Cocoa, не включены в список, так как они не полностью кроссплатформены).

Qt, один из старейших фреймворков, которому сейчас 21 год. Ранее принадлежал компании Nokia, текущий владелец – финская компания Qt Company. Платформа имеет лицензию, как свободное ПО с открытым исходным кодом, а также доступны версии Indie Mobile, Professional и Enterprise, начиная от $79 в месяц.

Этот старый фреймворк открыл себя заново со своей новой версией, Qt 5, которая используется везде, ото мобильных приложений до автомобилей и медицинского оборудования. Одним из его преимуществ является оконная системя, которая позволяет вам создавать пользовательские интерфейсы и включает в себя дополнительные функции, такие как отображение диаграмм, визуализация данных и карт от сторонних провайдеров. Qt версии 5 теперь обрабатывает прикосновения так же, как и взаимодействие с мышью и клавиатурой, и вы можете добавить виртуальные клавиатуры на X11 и Windows. На KDE Linux Qt является нативной библиотекой GUI, поэтому, если вы разрабатываете для KDE платформ, то вам следует рассмотреть Qt.

wxWidgets

Разработчик Джулиан Смарт создал wxWidgets 24 года назад (что делает его старше, даже чем Qt) и остается его главным разработчиком. Эта библиотека во многом похожа на Qt, хотя некоторые разработчики предпочитают ее, так как она использует родные графические элементы операционной системы, на которой запущена программа. Это заставляет приложения выглядеть более «родными»; например, на Windows, она будет использовать Windows графику.

(Для сравнения, Qt отрисовывает свои собственные виджеты на каждой платформе, хотя и старается выглядеть как можно ближе к платформе, используя некоторый низкоуровневый код для отрисовки полос прокрутки и кнопок.)

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

Первоначально разрабатываемая британским разработчиком Жюлем Сторером, была приобретена компанией Raw Material Software, которая разрабатывает аудиопродукцию. В результате, JUCE обладает большим количеством функциональных возможностей при работе с аудио, поскольку она изначально разрабатывалась для создания аудиоприложений.

Библиотека JUCE также включает в себя множество графических элементов пользовательского интерфейса, графику, аудио, парсинг XML и JSON, работу с сетью, криптографию, многопоточность и встроенный интерпретатор, который работает с синтаксисом, имитирующим ECMAScript. Это уменьшает или устраняет необходимость в сторонних библиотеках и проблемы с зависимостями, которые те могут вызвать. Нет ничего ужаснее, чем обновление сторонних инструментов, которое ломает сборку проекта.

JUCE также включает в себя “introjucer”, инструмент IDE, который может генерировать проекты Xcode, проекты Visual Studio, Linux Makefile, сборки Android Ant и проекты CodeBlocks.

CEGUI

Crazy Eddie GUI (GUI сумасшедшего Эдди) разрабатывается, начиная с 2003 года, и вполне возможно, версия 1.0 выйдет уже к 2020 году, поскольку текущая версия 0.87. Как и другие в этом списке, она работает на Windows, Linux и Mac и поддерживает и 64, и 32-битные системы. В отличие от остальных GUI библиотек в этом списке, она фокусируется на разработке игр, но, как говорилось, дает разработчику пакет виджетов (кнопки, выпадающие списки и т.д.), поэтому вы не ограничены только игровыми приложениями.

Большинство игр требуют графический интерфейс для всех меню и экранов настройки, которые рендерятся на таких платформах, как DirectX или OpenGL. Они поддерживают скины, позволяя выполнять настройку, чтобы соответствовать эстетике игры.

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

Chromium Embedded Framework – это простой фреймворк для встраивания браузеров на базе Chromium в другие приложения. Это отличает его от других библиотек C++ в списке, которые предназначены для создания автономных приложений. Вы могли не слышать об этом, но согласно документации, существует более 100 миллионов экземпляров CEF, встроенных во множество продуктов. CEF уже 8 лет, и он дорос уже до версии 3.

Интеграция в браузер Chrome позволяет получить доступ к JavaScript, ускорению GPU через WebGL, рендерингу в закадровую память и, в ближайшее время, к речевому вводу

Заключение

Хотя все эти библиотеки написаны на C++, доступно множество привязок языков, поэтому стоит проверить, какие языки программирования вы можете использовать с ними. wxWidgets особенно хорош в этом отношении, как и Qt, который используется в нескольких специализированных операционных системах и автомобильном ПО. Qt кажется более популярным на предприятиях, по-видимому, из-за платной поддержки, в то время как ученые и независимые разработчики предпочитают wxWidgets, поскольку он бесплатен и соответствует Qt.

И Qt, и wxWidgets охватывают много одинаковых областей, и это, возможно, случай для выбора в зависимости от личного предпочтения. Оба фреймворка имеют множество сторонних инструментов для упрощения разработки.

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

Обзор графических библиотек C++

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

Simple and Fast Multimedia Library — одна из наиболее быстрых и удобных библиотек для 2D-графики. У неё минимальные требования к уровню знаний C++, плюс она отличается лёгкостью освоения. С её помощью вы напишете полноценную программу всего за несколько дней. А первое графическое приложение «SFML works!» — всего за минуту. Также библиотека отличается кроссплатформенностью, работая под Windows, Linux и Mac.

SFML часто используется в небольших стартапах либо разработчиками, которые сами занимаются созданием игр. Инструмент популярен прежде всего потому, что не требует написания объёмного кода.

Это целый набор инструментов для проектирования GUI. Разумеется, можно писать и игры, но Qt привлекает больше своими достоинствами: удобство, быстрота, гибкость, кроссплатформенность. Библиотека доступна и на Windows, и на Linux, и на Mac, и на Windows Mobile, iOS и Android.

С помощью метаобъектного компилятора Qt расширяет C++, предоставляя дополнительные функции (к примеру, сигналы и слоты). Имеет платную службу технической поддержки и платную лицензию. Есть большой выбор IDE: QDevelop, Edyuk, QtDesigner, QtCreator. Доступна интеграция с Eclipse, XCode, Visual Studio.

Cairo

Используется для отрисовки векторных изображений под Windows, Mac OS, Linux. Применяется в браузерном движке Gecko, лежит в основе ряда ОС: MorphOS, AmigaOS. Если выбираете Cairo, будьте готовы к отсутствию ресурсов на русском языке.

Библиотека поддерживает взаимодействие с OpenGL-бэкендом с поддержкой GPU. Это, несомненно, открывает ряд полезных функций.

Cocos2D-X

Кроссплатформенная библиотека, призванная упростить разработку игр для мобильных платформ. По кроссплатформенности схожа с Qt, но есть и другие плюсы: доступность, удобство, возможность создания отдельного конструктора игр, который основан на библиотеке Cocos Creator.

Прекрасно подходит, если нужно работать с анимацией и графикой в небольших объёмах, т. к. вся графика добавляется извне (на неё ссылаются из кода).

Учтите, что уроки на эту библиотеку есть только на английском.

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

Библиотека особенно популярна среди тех, кто разрабатывает аудио-софт, так как имеет набор оболочек-интерфейсов для создания аудио-плагинов.

wxWidgets

Одна из старейших графических библиотек, предназначенных для отрисовки GUI. Главное достоинство — производительность. Если та же Qt использует низкоуровневый код только для кнопок и полос прокрутки, то wxWidgets использует для каждой системы свой код, благодаря чему элементы максимально похожи на системный стиль.

Другая важная особенность — использование «родных» графических элементов интерфейса ОС везде, где это возможно. Таким образом, можно говорить о существенном преимуществе для большинства пользователей, которые привыкают работать в определённой среде, и изменения интерфейса часто вызывают у них неудобства в работе.

SDL 2.0

Кроссплатформенная 2D-библиотека для написания приложений (как правило, игр). Поддерживает Windows, Mac OS, Linux, Android, Windows Mobile, iOS. Характеризуется быстротой, надёжностью и лёгкостью в эксплуатации. Также в SDL реализованы профессиональные инструменты, предназначенные для работы со звуком, что является большим плюсом при реализации крупных проектов.

Остаётся добавить, что библиотека хорошо интегрируется с OpenGL и комбинируется с wxWidgets.

Тоже очень известная графическая библиотека, которая широко применяется во многих системах. Сначала этот фреймворк задумывался как GIMP-компонент, но спустя 20 лет после выхода в свет первой стабильной версии библиотека нашла применение и в сотнях других приложений.

Сегодня практически не уступает Qt, поддерживая разные языки программирования. Кстати, это одна из немногих библиотек, которая взаимодействует с языком C.

Библиотека gui для начинающего программиста на С++

какая библиотека gui была бы хороша для кросс-платформы для новичков с использованием С++

Вам следует попробовать Qt. Это действительно приятно, и у него много функций, и это перекрестная платформа.

И здесь — это некоторые учебники для него.

Qt. Это кросс-платформенный и простой в использовании.


Вы должны взглянуть на gtkmm. Он написан в современном С++, использует stl, следует его соглашениям, включает поддержку utf-8. Что еще, это open source и кросс-платформенный.

В дополнение к QT, о котором говорили другие, посмотрите wxWidgets. Это перекрестная платформа и очень удобна для новичков.

Посмотрите другие вопросы по меткам c++ user-interface или Задайте вопрос

Форум русскоязычного сообщества Ubuntu

За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Посоветуйте GUI библиотеку для C++ и литературу по ней. (Прочитано 2090 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Страница сгенерирована за 0.078 секунд. Запросов: 24.

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Что такое GUI

GUI расшифровывается как graphical user interface, что по-русски переводится как графический интерфейс пользователя. Главное отличие GUI-приложения от консольного заключается в способе взаимодействия пользователя с приложением.

В консольном приложении общение с пользователем осуществляется в последовательной манере. То есть грубо говоря:

  1. Пользователь что-то ввел
  2. Приложение что-то ответило
  3. Пользователь снова что-то ввел
  4. Приложение снова что-то ответило
  5. и т.д.

И перескочить со 2-го пункта на 5-ый, если программой этого не было предусмотрено, при всем желании невозможно. Все очень строго.

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

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

Ясное дело, что сообщения эти не простые, а имеют строго установленную форму, например, когда вы двигаете мышкой, на каждый сдвиг отправляется сообщение WM_MOUSEMOVE, которое содержит информацию о позиции мыши, если вы куда-то кликаете отправляется сообщение WM_LBUTTONDOWN. Если вы нажимаете клавишу, то отправляется WM_KEYDOWN с кодом нажатой клавиши. И так далее.

Выглядит цикл сообщений на C примерно так:

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

К счастью, в наши развитые времена, заботиться об обработки сообщений не надо. И чтобы добавить реакцию на какое-нибудь сообщение, надо просто добавить соответствующий метод и особым образом привязать его к контролу.

Создаем интерфейс для задачи

Необходимо: разработать интерфейс для задачи: “Студенты Иванов и Петров за время практики заработали определенную сумму. Кто из них заработал большую сумму? Определить средний заработок”.

Создаем проект

Выбираем Файл/Создать/Проект, затем Приложение Windows Forms, жмем Ok

Откроется редактор формы:

Добавляем поля для ввода

На форму надо чего-то добавить. По задаче у нас два параметра, значит придется добавить два поля для ввода. Откроем панель с элементами и для удобства зафиксируем ее с помощью пипки в верхнем правом углу.

Если у вас вдруг не видно панели с элементами, включите ее через пункт меню Вид/Панель элементов

Теперь добавим элементы на форму, нам потребуется два элемента вида TextBox (поля для ввода текста)

Чтобы было понятно чего в них вводить добавим подписи (элементы типа Label)

Но у этих подписей вместо текста написано label1 и label2, поменяем их свойства. У всех элементов типа Label есть свойство Text, которое определяет чего в них писать. Выделим label1 кликнув на него, он обведется пунктирной рамкой

в правом нижнем углу найдем панель свойств (если ее не видно нажмите F4). Среди множества свойств найдем то что называется Text и введем в него корректный текст.

Закончив вводить переключимся на форму, кликнув на нее, если все было сделано корректно текст label1 заменится на руб. заработал Петров

Повторим ту же процедуру для label2

  • выберем на форме
  • в окне свойств в поле Text введем руб. заработал Иванов
  • снова переключимся на форму

Работаем с кнопкой

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

кнопка уже штука поинтереснее, давайте добавим ее какую-нибудь реакцию на щелчок. Выделим кнопку и щелкнем по ней два раза.

Нас перекинет в редактор кода, который будет выглядеть как-то так:

Мы только что создали обработчик события щелчка мыши по кнопке. В который можно добавить какую-нибудь реакцию на щелчок.

[Как работает обработчик]

Если вам не интересно как, смело пропускайте данный раздел =)

Что же тут произошло? А произошло тут создание функции (то есть Visual Studio за нас написала код, нам никто не мешает его ручками писать) с сигнатурой обработчика системного события. У функции два аргумента:

  • object sender – объект от которого пришло событие, в нашем случае это будет кнопка button1
  • EventArgs e – специфически свойства события, в клика нет особых свойства, а вот всякие события типа клика мыши или нажатия кнопки могут содержать дополнительную информацию (см. выше про системные события)

Далее студия привязала данную функцию к кнопке. Если смотреть через интерфейс (переключимся на форму нажав Shift+F7), то эта функция будет указана в качестве значения свойства Click в разделе Событий.

Если же смотреть еще глубже можно открыть, автогенерируемый файлик для формы Form1.Designer.cs

Там мы увидим код:

И если раскрыть узел Код автоматически созданный конструктором, то увидим сгенерированный код, который в явном виде описывает положение всех объектов на форме, а также привязанные к ним свойства. Приведу часть кода:

но ладно, вернемся к нашему обработчику.

Пишем обработчик

Если в какой-то момент времени вы потеряетесь среди файлов, то вы всегда можете дважды кликнуть на файл Form1.cs в обозревателе решений

а затем нажать F7 чтобы переключится непосредственно к коду формы.

И так, у нас там имеется код:

Нам по заданию надо будет вывести сообщение с решением задачи. Пока мы еще решатель не реализовали (точнее реализовывали, но еще сюда к новому коду не подцепили). А вот что-нибудь вывести уже можем. Правим обработчик:

Запустим приложение и проверим кнопку

Читаем значения из TextBox

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

Переключимся на форму, нажав Shift+F7. Выберем первое поле для ввода.

Чтобы получить содержимое TextBox надо сначала узнать имя элемента. Заглянем в панель Свойств, и найдем там свойство (Name). Это и есть его имя. По умолчанию там стот textBox1, поменяем его на что-то более осознанное (txtPetrovSum):

Теперь мы сможем обратиться к элементу по этому имени. Давайте теперь еще и поменяем свойство Name у второго textBox2. Поменяем его на txtIvanovSum. По итогу будем иметь следующие названия у элементов:

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

Запускаем и проверяем:

Можно собрать какую-нибудь фразу:

Добавив “\n” мы сможем вывести текст в две строки. Получится:

Но это мы все в игрушки играемся, давайте все таки уже задачу решим

Подключаем старый код

Для лучше переносимости, рекомендую уже реализованное решение исходной задачи сначала декомпозировать, и тогда вам будет достаточно скопировать класс с логикой. Я это уже сделал с задачей про студентов еще пару статей назад, поэтому я возьму код класса Logic

и вставлю этот класс вместе со всем его содержимым после класса Form1 в файле Form1.cs. Вот что у меня получится:

Очень важно вставить код класса ПОСЛЕ класса Form1, иначе получите страшную ошибку:

Внедряем логику

правим наш обработчик клика на кнопку:

Запускаем и проверяем:

А! Нам же еще среднее арифметическое надо вывести:

еще один запуск:

Обработка ошибок

Может вы уже столкнулись с этим, но если запустить приложение, ничего не ввести и просто нажать кнопку, программа выдаст ошибку:

появление ее закономерно, программа пытается с помощью метода int.Parse преобразовать строку в число, но в строке пусто и преобразовывать нечего. Аналогичная ошибка появится если ввести буквы вместо цифр.

Наверное было бы здорово, просто проигнорировать нажатие кнопки с некорректными данными, для этого нам надо заставить программу не падать. Делается это не сильно сложно, путем добавления конструкции для перехвата ошибок, Именуется она try-catch, и выглядит так:

правда если просто вставить код в таком виде то он будет ругаться на переменные ivanovSum и petrovSum, после блока try/catch. Это происходит потому что переменные инициализируются внутри блока try, надо их вынести вовне. Придется указать тип явно.

Красота! Можно сообщение выдавать об ошибке (но лучше не надо):

Это в принципе должно хватить для выполнения первого задания в лабе 4.

Цукерберг рекомендует:  Топ-10 самых распространенных вирусов в мире
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих