2015-08-27 6 views
0

Надеюсь, этот вопрос не слишком субъективен. Я хотел бы запустить собственный простой набор инструментов UI в C++, то есть библиотеку, которая может создавать пользовательский интерфейс на многих платформах (более или менее упрощенную версию основ QT), предоставляя все свои элементы управления. Я делаю это ради учебы, поэтому, пожалуйста, воздержитесь от публикации . Вы не должны изобретать велосипед, так как конкурировать с основными инструментами пользовательского интерфейса действительно не моя цель.Запуск моего собственного простого инструментария пользовательского интерфейса

Вопрос: какой API я должен использовать для Windows и Linux для создания своего инструментария?

Я исследовал немного, и я полагаю, что я должен рисовать все с помощью GDI + в Windows и, возможно, cairo в Linux (не уверен в этих двух).

Рисование интерфейс с OpenGL, вероятно, выполнимо, но

  1. Потребует путь больше работы
  2. бы, наверное, не самое лучшее, что делать, так как OPENGL серия примитивов оптимизированная для 3D-графики, а не 2D те

Вопрос в том, какой API я должен использовать для Windows и Linux для запуска этого проекта? Надеюсь, я сузил его достаточно, чтобы объективно его подобрать.

+0

GDI + будет обслуживать практически все ваши 2D-требования в Windows. Основных вызовов GDI почти всегда будет достаточно. – cppguy

+0

@cppguy Проблема с GDI + заключается в том, что она существует только для Windows (и в Wine). Если вы рисуете, используя GDI + в Windows, вы получите разные результаты, чем рисование с использованием других систем рисования. Таким образом, использование встроенного GDI + в кросс-платформенном наборе инструментов - очень плохая идея, это приводит к большему количеству проблем, чем оно решает. Можно использовать GDI + из Wine, или Cairo, или, возможно, Blend, когда это станет доступным ... –

+0

Пользовательский интерфейс MS-Windows и протокол X, используемые в Linux, не могут быть более разнородными. Какой бы вы ни выбрали, ваша работа, как правило, очень мало, на другой платформе. Кросс-платформенные инструментальные средства, такие как QT, как правило, либо несколько неудобны на платформах, отличных от тех, на которых они основаны; или, чтобы обеспечить межплатформенную функциональную совместимость, они ограничивают себя небольшой функциональностью на всех платформах и не могут воспользоваться уникальными функциями каждой платформы. –

ответ

2

Рисование с использованием любого конкретного API-интерфейсов не будет работать, поскольку вы хотите использовать несколько платформ, и их API-интерфейсы не перекрываются и не работают одинаково. Есть очень веская причина, почему инструментарий, такой как Qt или WPF, не использует собственный чертеж: он не работает. Я имею в виду, давай, даже собственный WPF от Microsoft этого не делает.

Скорее всего, вы захотите сделать именно то, что делает Qt: у вас есть собственный растровый чертежный чертеж. Вы можете использовать cairo или другую библиотеку для этого. Если вам нужна богатая функциональность вычислительной геометрии (пересечения кривой, внутренние/внешние проверки и т. Д.), Вы можете использовать cgal в качестве детализации реализации. Это позволило бы реализовать эквиваленты QPainterPath, QPolygon и т. Д. Быстро и, вероятно, с лучшими результатами, чем в Qt.

Что вы можете сделать намного лучше по сравнению с Qt - это состав виджета и многопоточность. Прямо сейчас, виджеты Qt являются однопоточными, но они не обязательно должны быть. Когда виджеты нарисованы в хранилище резервных копий верхнего уровня, они компонуются, и это происходит в порядке Z, серийно. Это не обязательно должно быть, хотя - перекрывающиеся виджеты образуют дерево, а несколько узлов в этом дереве могут быть отображены и составлены параллельно. Это одна вещь, которую Qt никогда не исправит, поскольку модуль виджетов считается законченным, более или менее. Вам также не нужно включать такие чудовища, как QPixmap, что имело смысл в пред-Qt 4.2 днях, но больше не работает.

Наконец, вы, вероятно, должны придерживаться современного C++ 11 и его контейнеров - вы избегаете многого крушения таким образом.У Qt не было свободы делать это, и на некоторое время не будет. Вероятно, вам также понадобится усиление.

На обеих платформах API, которые вы будете использовать для взаимодействия с пользователем, необходимы для обновления содержимого окна с помощью собственного растрового изображения и цикла событий. Таким образом, WINAPI на Windows, XCB (предпочтение над Xlib) для экранов X11, VNC для себя, Cocoa для OS X. Qt повторно использует glib для своего цикла событий в системах X11, но я не знаю достаточно об этом, чтобы сделать рекомендацию ,

+0

Почему так много Qt ненавидят? Да, это не идеально, но с другой стороны - нет ничего лучше (даже в мире не C/C++). Лично я надеюсь на нового преемника Qt на Rust. Потому что нет необходимости в «исправлении» наследия C++, что составляет половину кода Qt. – RazrFalcon

+0

@ RazrFalcon Это не ненависть Qt, это реальность. Я хардкорный сторонник Qt, но я тоже понимаю его недостатки. Самое большое преимущество Qt - огромная, хорошо протестированная база кода. Это также является его недостатком, так как его трудно изменить, не вводя новый код, который обязательно будет содержать ошибки. Все, что я разрабатываю для настольных компьютеров, использует Qt :) и довольно много кода сервера. –

+0

Спасибо, хороший обзор того, что мне нужно. Я, скорее всего, буду придерживаться cairo (у него также есть лицензия MPL с либеральной лицензией .. что-то коммерчески выгодное - еще одна цель, которую я не писал). – Dean

1

Я не знаю о Windows, но простые вызовы X11/Xlib должны делать это для Linux (я написал что-то подобное). Все, что над ним, уже является платформой. Однако X11 имеет только несколько примитивов рисования для линий, заполняющих прямоугольники & полигонов. Для текста используйте Xft (FreeType), шрифты выглядят намного лучше. Структура событий для X11 довольно проста, но элегантна; для документирования Я рекомендую https://tronche.com/gui/x/xlib/

Я бы избегал Xt, так как он пытается создать слой «ориентированный объект» над X11 в C, что является ИМО довольно сложным.

+1

Я бы порекомендовал XCB над Xlib, это гораздо более современно. –

1

Если вы хотите придерживаться OpenGL - попробуйте взглянуть на ImGui.

Для упрощенного Qt вы можете посмотреть wxWidgets.

Думаю, во-первых, вы должны показать нам список функций, которые вы хотите реализовать. Чем вы можете получить советы.

Смежные вопросы