Как мне построить графический интерфейс пользователя в C ++? [закрыто]

270

До сих пор все мои программы на C ++ использовали интерфейс командной строки, и единственный другой язык, с которым у меня есть опыт, - это PHP, который не поддерживает GUI.

С чего начать с графического программирования пользовательского интерфейса на C ++? Как мне его создать?

waiwai933
источник
4
Это зависит. На какую операционную систему вы ориентируетесь? Многие GUI-структуры зависят от ОС.
Майкл Ратанапинта
3
Какая ОС / платформа? Или, если вы заинтересованы в написании кроссплатформенных приложений с графическим интерфейсом, скажите так - эти вещи имеют огромное значение для C ++ ...
Shog9
3
PHP поддерживает написание программ с графическим интерфейсом. Нет никаких причин, по которым вы не можете запускать программы PHP из командной строки, и есть библиотеки графического интерфейса, такие как PHP-GTK gtk.php.net и PHP-Qt php-qt.org, которые могут помочь. Вам также может понравиться оценить, зачем вам нужно C ++. Написание GUI на c ++ сложнее, чем на многих других языках, и вы можете объединить свой код c ++ в библиотеки, которые можно вызывать из Python или C # или PHP или что-то более простое для написания кода GUI.
Кибу
6
Ваш вопрос настолько широк, что я думаю, что вам нужны не только названия наборов инструментов или даже просто некоторые учебные пособия. Вам нужны книги , которые дают вам больше, чем API или примеры, которые на самом деле дают вам концепции. KTC рекомендует некоторые из них ниже, но я бы посоветовал, какой бы инструмент вы ни выбрали, чтобы начать играть, обязательно найдите тот, о котором вы тоже можете прочитать.
кварк
6
«Написание GUI на c ++ сложнее, чем на многих других языках». На чем вы основываете это утверждение?
Петр

Ответы:

164

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

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

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

  • проверить очередь событий, если есть какие-либо новые события
  • если есть, отправьте эти события соответствующим обработчикам
  • когда вы закончите, верните управление операционной системе обратно (обычно с помощью какого-то специального вызова функции "sleep" или "select" или "yield")
  • тогда функция yield вернется, когда операционная система будет готова, и у вас будет еще один цикл.

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

Вы должны иметь в виду, что программирование GUI невероятно сложно и вообще сложно. Если у вас есть возможность, на самом деле гораздо проще просто встроить встроенный веб-сервер в вашу программу и иметь интерфейс на основе HTML / web. Единственное исключение, с которым я столкнулся, - это учебники Apple по созданию интерфейса Cocoa + Xcode +, которые делают его легко доступной средой для людей, плохо знакомых с программированием GUI, которые я видел.

бретонский
источник
1
« На самом деле гораздо проще просто встроить встроенный веб-сервер в вашу программу и иметь интерфейс на основе html / web». Это зависит. Если вы хотите делать модные вещи (сложные пользовательский интерфейс, пользовательские элементы управления, анимации и т. Д.), Да. Если вы просто хотите типичный графический интерфейс (с обычными элементами управления и родным чувством), нет.
Желудь
167

Существует множество бесплатных переносимых графических библиотек , каждая из которых имеет свои сильные и слабые стороны:

Особенно в Qt есть хорошие учебники и инструменты, которые помогут вам начать работу. Наслаждайтесь!

Однако обратите внимание, что вам следует избегать специфических для платформы функций, таких как Win32 API или MFC. Это связывает вас без нужды на конкретной платформе практически без каких-либо преимуществ.

ВОГ
источник
25
Лично я считаю, что программирование на Win32 API - это красиво. Мне это нравится гораздо больше, чем использование Qt, и это само по себе является преимуществом. Может быть, это только я, хотя.
mrduclaw
6
Мой личный опыт как раз наоборот. Win32 API доставил мне больше хлопот, чем любой другой API.
Vog
17
@mrduclaw, «Я думаю, что программирование под Win32 API - это прекрасно». Я стараюсь любой ценой написать переносимый код. (обратите внимание, что я использовал слово «попробуй», потому что есть исключения ...) Как написание непереносимого кода считается «красивым»?
Тревор Бойд Смит
11
@Trevor Бойд Смит: Полагаю, разные цели. Почти ни один из кодов, которые я когда-либо писал профессионально, не мог быть кросс-платформенным, так что это никогда не беспокоило меня.
mrduclaw
1
вопрос на миллион долларов в том, что парни, которые делают игровые тренажеры, просто предоставляют небольшой exe, и их программы имеют красивый пользовательский интерфейс, так что мне интересно, как они создают пользовательский интерфейс, они не предоставляют этим сторонним библиотекам?
user889030
74

Независимый от ОС алгоритм « Создание приложений с графическим интерфейсом в C ++ в три этапа »:

  1. Установите Qt Creator

    введите описание изображения здесь

  2. Создать новый проект (Приложение Qt Widgets)

    введите описание изображения здесь

  3. Построить это.

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

Теперь вы готовы прочитать много документации, чтобы создать нечто более сложное, чем приложение «Hello world».

Кирилл Васильевич Лядвинский
источник
В прошлом у меня были проблемы с другими графическими интерфейсами, которые были недостаточно дружелюбны для начинающих. Но у Qt есть отличные учебники. Спасибо за рекомендацию!
JD
23

Учитывая комментарий «скажем, Windows XP в качестве примера», тогда ваши варианты:

  • Взаимодействуйте напрямую с операционной системой через ее API, который для Microsoft Windows является неожиданным сюрпризом для Windows API . Окончательной ссылкой на WinAPI является веб-сайт Microsoft MSDN . Популярным онлайновым учебником для начинающих для этого является учебник по программированию Win32 API для Forger . Классическая книга для этого - « Программирование Windows Чарльза Петцольда» , 5-е издание .

  • Используйте платформу (как с точки зрения ОС, так и компилятора), специфическую библиотеку, такую ​​как MFC , которая оборачивает WinAPI в класс C ++. Ссылка для этого снова MSDN. Классическая книга для этого - « Программирование Windows Джеффом Просизом с помощью MFC, 2-е издание» . Если вы используете скажем CodeGear C ++ Builder, то вариант здесь VCL .

  • Используйте кроссплатформенную библиотеку, такую ​​как GTK + (оболочка C ++: gtkmm ), Qt , wxWidgets или FLTKэто обертка API конкретной ОС. Преимущества этого в том, что в целом ваша программа может быть скомпилирована для разных ОС без необходимости изменения исходных кодов. Как уже упоминалось, у каждого из них есть свои сильные и слабые стороны. Одним из соображений при выборе того, который использовать, является его лицензия. В приведенных примерах GTK + & gtkmm - это лицензия LGPL, Qt - под различными лицензиями, включая проприетарную, wxWidgets - под собственной лицензией wxWindows (с переименованием в wxWidgets License), а FLTK - под LGPL, за исключением. Для справки, учебника и / или книг, обратитесь к веб-сайту каждого для деталей.

КТС
источник
9
MFC это зло. Я бы предпочел использовать WIN API, если бы у меня не было другого выбора.
the_drow
@the_drow А как насчет sourceforge.net/projects/win32-framework
Джерри Иеремия,
18

Поскольку я уже был там, где вы сейчас находитесь, я думаю, что могу «ответить» вам.

Дело в том, что нет простого способа сделать графический интерфейс. Графический интерфейс сильно зависит от кода платформы и ОС, поэтому вы должны начать читать документацию по вашей целевой платформе / ОС по API управления окнами. Хорошая вещь: есть много библиотек, которые устраняют эти ограничения и абстрактные архитектурные различия в едином многоплатформенном API. Предложенные ранее GTK и Qt являются некоторыми из этих библиотек.

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

Подводя итог, можно сказать, что существуют также несвободные «среды» для разработки GUI, такие как Visual Studio от Microsoft. Для тех, кто имеет опыт работы с Delphi , Visual Studio может быть более знакомым. Существуют также бесплатные альтернативы полной среде Visual Studio, поставляемые Microsoft: Visual Studio Express , которых более чем достаточно для начала разработки графического интерфейса.

Паучок
источник
15

Я нашел сайт с «простым» учебником: http://www.winprog.org/tutorial/start.html

ZippyV
источник
8
Это представляет Win32 API, очень низкоуровневый подход к программированию GUI, который связывает вас с платформой Windows. Я бы не рекомендовал это.
Vog
17
Это правильный вариант. Я согласен, что это может быть не самое лучшее место для старта, но оно не заслуживает отрицательного голосования.
Эмиль Х
1
Я знаю, что это не идеальное решение, но оно помогает узнать, как работает система графического интерфейса в Windows. Я прочитал это руководство пару лет назад, и теперь я знаю, что такое цикл обработки сообщений и как он работает. При работе с winforms в .net эти знания могут пригодиться.
ZippyV
7
Если вы собираетесь писать настольные приложения, ничто не заменит знания о том, как ОС на самом деле рендерится и взаимодействует с пользователем. Если вы просто используете библиотеку, не понимая основ, то вы никогда не поймете, что происходит. Изучение немного низкого уровня программирования Win32 GUI будет хорошо потрачено время.
Джим в Техасе
@Jim В Техасе: я согласен, но этот «бит низкого уровня» следует изучать после основ, поэтому я все еще нахожу эту рекомендацию неуместной для начинающих.
Vog
3

Легко создать .NET Windows GUI на C ++.

Смотрите следующий учебник от MSDN . Вы можете скачать все, что вам нужно (Visual C ++ Express) бесплатно .

Конечно, вы привязываете себя к .NET, но если вы просто играете или нуждаетесь только в приложении Windows, у вас все будет хорошо (у большинства людей Windows все еще есть ... пока).

Justicle
источник
3

Я использую FLTK, потому что Qt не является бесплатным. Я не выбираю wxWidgets , потому что мой первый тест с простым Hello, World! Программа выдала исполняемый файл размером 24 МБ, FLTK 0,8 МБ ...

pernecker
источник
4
Из-за изменений в лицензии QT я планирую перейти на QT
pernecker
2
Моя собственная программа wxWidgets составляет 5,9 Мб, даже со всеми связанными библиотеками внутри
msangel