c# c++ wpf qt user-interface

Elegir entre WPF/C#y Qt/C++



user-interface (7)

Diría que debes quedarte con Qt si ya tienes una gran base de código C ++. WPF no es tan increíble ni tan fácil de desarrollar como dicen. C ++ y Qt es un equipo bien conocido, sin formato C ++ (no .NET) con WPF no lo es.

Mi equipo y yo estamos desarrollando una aplicación que implica un back-end escrito en C ++ e implica el uso de bibliotecas como OpenCV, MIL, etc.

Ahora, necesitamos desarrollar una GUI para interactuar con este programa, de modo que la GUI muestre las imágenes, y el usuario pueda interactuar con las imágenes y anotar / marcar las imágenes, y luego ejecutar los algoritmos de procesamiento de imágenes escritos en C ++ para mostrar los resultados .

Para la GUI, estoy atascado eligiendo entre WPF y Qt Personalmente encuentro que WPF es más fácil y más poderoso que Qt Entiendo que WPF no es portátil para Linux, pero no me preocupa demasiado ... También, WPF usa la tecnología de DirectX, que tendré que usar para generar una visualización en 3-D en una etapa posterior.

Por favor ayúdame con estos puntos:

  1. ¿Puedo conectar WPF directamente con C ++ (y no con Visual C #?)
  2. Si (Punto 1) no es posible, entonces considere esto: El código en C ++ va a ser grande, y también involucra algunas bibliotecas, entonces ¿puedo usar C # para llamar a las funciones C ++? ¿El tiempo invertido en aprender Qt sería menor que hacer mi el código C ++ no OO no administrado funciona con WPF?

(Tengo la sensación de que tendría que escribir demasiados códigos para interconectar C ++ con WPF, lo que puede equivaler a reescribir la mitad del programa real en sí ... :-()


En el escenario WPF, no estaría interactuando directamente desde WPF (es decir, vistas xaml) directamente a su C ++ no administrado. Siempre desearía envolver sus módulos C ++ en algún tipo de contenedor administrado VB o C #. (En teoría, podría usar un contenedor Managed C ++, pero estaría loco por hacer esto). WPF necesita Modelos de Vista delgados escritos al menos en un lenguaje .NET. WPF no debería tener ningún acceso directo a su código no administrado, por lo que la pregunta es más "¿Pueden las aplicaciones .NET interactuar con C ++ no administrado?" y la respuesta es sí, sin duda.

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


Hace un par de años que he estado usando SWIG para hacer que C ++ DLL pura (no administrada) esté disponible en las aplicaciones de WPF. Funciona de maravilla, sin problemas en absoluto, y esto es para grandes aplicaciones como el entrenador de mantenimiento de aviónica.

SWIG es genial porque con un conjunto de archivos de interfaz (que escribes en base a tus archivos de cabecera .h, por lo que es bastante fácil), puedes generar todo el código de andamios para exportar tu DLL C ++ a varios idiomas como C #, Python, Lua, Java. SWIG genera el código que necesita si desea extender una clase de C ++ desde C # o Lua, maneja excepciones de paso entre idiomas (para que una secuencia de comandos Lua arroje una excepción que atraviese la capa de C ++ y quede atrapado en el nivel C #, por ejemplo ), etc. Nunca tenemos que tocar PInvoke (SWIG lo hace todo). Es asombroso.

De esta manera, la misma interfaz SWIG nos permitió usar WPF (C #, con .NET 4) para la GUI, un back-end nativo de C ++ (a través de SWIG) para algunas bibliotecas existentes con las que teníamos que integrar e incorporar un intérprete Lua para soportar scripting de la aplicación (a través de SWIG, los mismos archivos de interfaz .i y lua-icxx en sourceforge para simplificar la interacción con la pila de intérpretes Lua C API).

Me pregunto cómo Qt / QML se compara con WPF / XAML ahora, 2 años después de que comenzó este hilo. Y veo que ahora hay Qt3D para agregar 3D incorporado como está disponible en WPF desde hace un tiempo (admite lienzo 3D de forma nativa, sin OpenGL o DirectX).


He usado tanto Qt con C ++ y WPF. Prefiero WPF como un marco de interfaz de usuario. Qt no está mal, especialmente después de 4.0. Ni siquiera tocaría versiones anteriores de Qt.

Como han dicho otros en sus comentarios, WPF está mejor documentado y la comunidad en línea es más grande. Si está buscando aplicaciones con estilo, WPF es sin duda el camino a seguir. El lenguaje declarativo de Qt, que es nuevo, es un buen paso en ese camino, pero debido a que es tan nuevo, tiende a ser un poco problemático. WPF ha existido por más tiempo, y es más maduro y más rico en características.

Sin embargo, creo que el verdadero problema en su caso es la base de código de C ++ que tiene.

WPF requerirá una capa de C ++ / CLI (C ++ administrado) para interactuar correctamente con su base de código de C ++. Esto suena complicado, y requiere un poco de trabajo, pero no es tan loco como podría parecer. Y también hay toneladas de documentación sobre esto. Personalmente, me mantendría alejado de PInvoke.

Qt es un poco más fácil porque está basado en C ++, pero tendrá que hacer alguna traducción entre los tipos nativos de c ++ y los tipos de Qt (como QString, QList, etc.) que se usan internamente.

Otra cosa a considerar es qué aspecto y sensación le gustaría para su UI. Por ejemplo, si estabas pensando en un buen aspecto de Ribbon (oficina 2008, 2010), entonces no obtendrás esto con Qt. Además, hay un montón de controles WPF de terceros, pero no he encontrado muchos para Qt. En algunos casos, es muy útil comprar un buen conjunto de controles para complementar los que Microsoft da por defecto.

En los últimos años, donde no tenemos el requisito de tener una UI de Linux, hemos utilizado WPF, independientemente de la base de código. No nos hemos arrepentido todavía.

Sin embargo, también sugeriré una tercera opción. Code-jock es un marco de interfaz de usuario que se basa en MFC, creo. Está basado en C ++ y ActiveX. Se ha vuelto bastante sofisticado. Compruébalo here .

EDITAR: QML ha recorrido un largo camino desde la primera vez que lo analicé. No he tenido tiempo de verlo en profundidad, pero por lo que escucho ofrece algunas características muy interesantes. Vale la pena una mirada extra.

Además, como han indicado algunos comentarios, hay más controles similares a Office, como una cinta, y también algunos controles de diagrama y gráficos que se han agregado al conjunto de herramientas Qt. Estos hacen de Qt una perspectiva interesante.

Sin embargo, voy a respaldar algo que dije antes, que como programador encuentro que hacer UI con WPF es mucho más fácil, y estoy más satisfecho con mis resultados que cualquier cosa que haya codificado alguna vez con Qt.


Si es C ++, quédate con Qt. La parte 3D de su proyecto puede ser manejada por el widget OpenGL de Qt. Elegir la ruta WPF te obligará a hacer algunas partes en C # o VB.net (siempre malas prácticas). No hay mucha ventaja en el uso de WPF con C ++. Además, el resto de tu código es C / C ++. se adapta a tus necesidades OpenCV, MIL, etc. son de alguna manera más fáciles de integrar con Qt en lugar de realizar llamadas P / Invoke con WPF (lo que también causará retrasos debido al mapeo de .Net).


Su código WPF deberá estar en C # o VB para obtener soporte de diseñador y herramientas. La interoperabilidad entre C # y C ++ es muy buena mediante el uso de ensamblajes de modo mixto, que le permiten codificar un módulo en C ++ que se compila en una combinación de código administrado y no administrado. Esto le proporciona interoperabilidad segura para el tipo de sus bibliotecas C ++ nativas.

Consulte here para obtener información sobre conjuntos de modos mixtos. Podemos responder por ellos.

Una consideración importante de la OMI es la curva de aprendizaje de WPF. Si puede traer a su equipo con usted, creo que puede ser extremadamente productivo.


WPF es el marco de la interfaz de usuario y no el lenguaje de programación. Puede escribir la aplicación WPF en C # o VB .NET. Para usar código nativo de C ++ desde la aplicación .NET, tiene dos opciones:

  1. PInvoke: permite llamar a la API C simple desde bibliotecas nativas. PInvoke no puede funcionar con clases de C ++, solo funciones. Funciona de la misma manera que las llamadas API en VB6.

  2. Usando C ++ / CLI wrapper, puede escribir .NET Dll que puede ser utilizado por clientes C # / VB .NET. Internamente, este Dll usa librerías C / C ++ nativas.

Si se siente cómodo con WPF y no necesita una solución multiplataforma, puede usarlo. Necesita aprender la parte de interoperabilidad. C ++ / CLI es un lenguaje bastante complicado, pero el programador que conoce tanto C ++ nativo como .NET puede aprenderlo.

Por otro lado, Qt permite utilizar cualquier código C / C ++ existente directamente y proporciona una solución multiplataforma.