Подтвердить что ты не робот

Выбор между WPF/С# и Qt/С++

Me и моя команда разрабатывают приложение, которое включает в себя контур, написанный на С++, и включает в себя использование таких библиотек, как OpenCV, MIL и т.д.

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

Для графического интерфейса я придерживаюсь выбора между WPF и Qt Я лично считаю, что WPF будет проще и мощнее, чем Qt Я понимаю, что WPF не переносится в Linux, но я не беспокоюсь об этом слишком много... Кроме того, WPF использует технологию DirectX, которую, возможно, придется использовать для создания некоторой трехмерной визуализации на более позднем этапе.

Пожалуйста, помогите мне с этими моментами:

  • Можно ли напрямую связать WPF с С++ (а не с Visual С#?)
  • Если (точка 1) невозможно, рассмотрим следующее: Код на С++ будет большим, а также с некоторыми библиотеками, поэтому я могу использовать С# для вызова функций С++ Будет ли время, затраченное на обучение Qt, меньше, чем использование моего неуправляемого кода OO С++ с WPF?

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

4b9b3361

Ответ 1

Я использовал оба Qt с С++ и WPF. Я предпочитаю WPF как интерфейс пользователя. Qt неплохо, особенно пост 4.0. Я даже не касался более ранних версий Qt.

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

Однако, я думаю, что реальная проблема в вашем случае - это база данных С++, которая у вас есть.

WPF потребует слой С++/CLI (управляемый С++), чтобы правильно взаимодействовать с вашей базой кода С++. Это звучит сложнее и требует немного работы, но это не так безумно, как может показаться. И в этом есть тонна документации. Лично я бы держался подальше от PInvoke.

Qt немного проще, потому что он основан на С++, но у вас будет некоторый перевод между родными типами С++ и типами Qt (например, QString, QList и т.д.), которые используются внутри.

Еще одна вещь, которую следует учитывать, - это то, что вы хотите и хотите для своего пользовательского интерфейса. Например, если вы подумывали о красивой ленте (office 2008, 2010), то вы не получите этого с Qt. Кроме того, есть тонна сторонних элементов управления WPF, но я не нашел очень много для Qt. В некоторых случаях очень удобно покупать хороший набор элементов управления, чтобы дополнить те, которые Microsoft предоставляет по умолчанию.

За последние пару лет, когда у нас нет требования иметь интерфейс Linux, мы использовали WPF, независимо от базы кода. Мы еще не пожалели об этом.

Однако я также предлагаю третий вариант. Code-jock - это интерфейс, основанный на MFC, я считаю. Это С++ и ActiveX. Это стало довольно сложным. Проверьте здесь.

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

Кроме того, как было указано в нескольких комментариях, существует больше элементов управления Office, таких как лента, а также некоторые элементы управления диаграммой и графикой, которые добавлены в набор инструментов Qt. Это делает Qt интересной перспективой.

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

Ответ 2

Если это С++, придерживайтесь Qt. 3D-часть вашего проекта может обрабатываться виджетами Qt OpenGL. Выбор пути WPF заставит вас делать некоторые части на С# или VB.net(всегда плохая практика). Преимущество использования WPF с С++ невелик. Кроме того, остальная часть вашего кода - C/С++. соответствует вашим потребностям. OpenCV, MIL и т.д. Несколько проще интегрировать с Qt вместо того, чтобы делать вызовы P/Invoke с WPF (что также вызовет задержки из-за сортировки .Net).

Ответ 3

Я бы сказал, что вы должны придерживаться Qt, если у вас уже есть большая С++-кодовая база. WPF не такой потрясающий и не так прост в разработке, как говорится. С++ и Qt - хорошо известная команда, простой С++ (не .NET) с WPF не является.

Ответ 4

WPF - это интерфейс пользовательского интерфейса, а не язык программирования. Вы можете писать приложение WPF в С# или VB.NET. Чтобы использовать собственный код С++ из приложения .NET, у вас есть два варианта:

  • PInvoke - позволяет вызывать простой API C из родных библиотек. PInvoke не может работать с классами С++, а только с функциями. Он работает так же, как API-вызовы в VB6.

  • С помощью С++/CLI-оболочки вы можете написать .NET Dll, которая может использоваться клиентами С#/VB.NET. Внутренне это Dll использует собственные библиотеки C/С++.

Если вы чувствуете себя комфортно с WPF и не нуждаетесь в кросс-платформенном решении, вы можете использовать его. Вам нужно изучить часть совместимости. С++/CLI - довольно сложный язык, но программист, который знает как собственные С++, так и .NET, может изучить его.

С другой стороны, Qt позволяет напрямую использовать любой существующий код C/С++ и дает кросс-платформенное решение.

Ответ 5

Последние пару лет я использую SWIG для создания чистой (неуправляемой) С++ DLL, доступной в приложениях WPF. Он отлично работает, никаких проблем вообще, и это для больших приложений, таких как тренер по обслуживанию авионики.

SWIG - это здорово, потому что с помощью одного набора файлов интерфейса (который вы пишете на основе ваших файлов заголовков .h, так легко) вы можете сгенерировать весь код леса для экспорта вашей С++ DLL на несколько языков, таких как С#, Python, Lua, Java. SWIG генерирует необходимый код, если вы хотите расширить класс С++ с С# или Lua, он обрабатывает исключения для всех языков (поэтому Lua script может генерировать исключение, которое стекает через слой С++ и попадает на уровень С# например) и т.д. Нам никогда не нужно прикасаться к PInvoke (SWIG делает все). Это потрясающе.

Таким образом, тот же интерфейс SWIG позволил нам использовать WPF (С#, с .NET 4) для GUI, собственный С++-бэкэнд (через SWIG) для некоторых существующих библиотек, с которыми нам пришлось интегрироваться, и встраивать Lua-интерпретатор для поддержки сценариев приложения (через SWIG, те же файлы интерфейса .i и lua-icxx на sourceforge, чтобы упростить взаимодействие с стеком интерпретатора Lua C API).

Мне интересно, как Qt/QML сравнивается с WPF/XAML сейчас, через 2 года после запуска этого потока. И теперь я вижу, что теперь Qt3D добавляет встроенный 3D-интерфейс, который был доступен в WPF некоторое время (поддерживает 3D-холст изначально, без OpenGL или DirectX).

Ответ 6

Ваш код WPF должен быть на С# или VB, чтобы получить поддержку дизайнера и инструментария. Взаимодействие между С# и С++ является очень хорошим благодаря использованию сборок смешанного режима, которые позволяют вам кодировать модуль на С++, который компилируется в сочетание управляемого и неуправляемого кода. Это дает вам безопасный тип взаимодействия с вашими родными библиотеками С++.

См. здесь для получения информации о сборках смешанного режима. Мы можем поручиться за них.

Одним из важных соображений IMO является кривая обучения WPF. Если вы можете принести свою команду с собой, я считаю, что она может быть чрезвычайно продуктивной.

Ответ 7

В сценарии WPF вы не будете напрямую взаимодействовать с WPF (т.е. представлениями xaml) непосредственно на неуправляемом С++. Вы всегда хотели бы обернуть ваши модули С++ каким-то VB или С# управляемой оболочкой. (Теоретически вы можете использовать обложку Managed С++, но вы бы с ума могли это сделать.) WPF нуждается в тонком представлении моделей, написанных на языке .NET, по крайней мере. WPF не должен иметь никакого доступа непосредственно к вашему неуправляемому коду, поэтому вопрос более "может ли интерфейс .NET приложений с неуправляемым С++?" и ответ - да, конечно.

http://msdn.microsoft.com/en-us/library/aa984739(v=VS.71).aspx