我和我的团队正在开发一个应用程序,它涉及一个用C ++编写的后端,并涉及使用OpenCV,MIL等库。
现在,我们需要开发一个GUI来与该程序进行交互,以便GUI显示图像,用户可以与图像交互并注释/标记图像,然后运行用C ++编写的图像处理算法显示结果。
对于GUI,我很难在WPF和Qt之间进行选择 我个人觉得WPF比Qt更容易,也更强大 我知道WPF不能移植到Linux,但我并不担心这太多...... 此外,WPF使用DirectX技术,我可能不得不在稍后阶段使用它来生成一些3D可视化。
请帮助我解决以下几点:
(我有一种下沉的感觉,我必须编写太多的代码来连接C ++与WPF,这可能等于重写实际程序本身的一半...... :-()
答案 0 :(得分:31)
我已将Qt与C ++和WPF一起使用。我更喜欢WPF作为用户界面框架。 Qt也不错,尤其是4.0之后。我甚至不会触及早期版本的Qt。
正如其他人在评论中所说,WPF有更好的文档记录,在线社区更大。如果您正在查看样式应用程序WPF肯定是要走的路。 Qt的声明式语言是新的,沿着这条道路迈出了一大步,但因为它是如此新颖,它往往有点儿马车。 WPF已经存在更长时间,并且功能更加成熟和丰富。
但是,我认为你的案例中的真正问题是你拥有的c ++代码库。
WPF将需要C ++ / CLI层(托管C ++)才能与您的c ++代码库正确连接。这听起来很复杂,确实需要一点点工作,但它并不像听起来那么疯狂。此外还有大量关于此的文档。我个人会远离PInvoke。
Qt稍微容易一点,因为它是基于c ++的,但你可以在c ++本机类型和内部使用的Qt类型(如QString,QList等)之间进行一些翻译。
要考虑的另一件事是您希望UI的外观和感觉。例如,如果你正在考虑一个漂亮的Ribbon(office 2008,2010)外观,那么你将无法通过Qt得到这个。此外,还有大量的第三方WPF控件,但我没有为Qt找到很多。在某些情况下,购买一组很好的控件以补充Microsoft默认提供的控件非常方便。
在过去的几年中,我们没有要求拥有Linux UI,我们一直在使用WPF,无论代码库如何。我们还没有后悔。
但是,我还建议第三种选择。 Code-jock是一个基于MFC的UI框架,我相信。它是基于c ++和ActiveX的。它变得非常复杂。请查看here。
编辑: 自从我第一次看到它以来,QML已经走过了漫长的道路。我没有时间深入研究它,但据我所知,它提供了一些非常有趣的功能。值得一看。
此外,正如一些评论所指出的那样,还有更多类似Office的控件,如功能区,以及添加到Qt工具集的一些图表和图形控件。这些确实使Qt成为一个有趣的前景。
我会支持我之前说的一些事情,作为一名程序员,我发现使用WPF制作UI变得更加容易,而且我对我的结果比我用Qt编写的任何内容都更满意。
答案 1 :(得分:25)
如果是C ++,请坚持使用Qt。项目的3D部分可以由Qt的OpenGL小部件处理。 选择WPF路径将迫使你在C#或VB.net中做一些部分(总是不好的做法)。 使用WPF与C ++没有太大的好处。 此外,您的其余代码是C / C ++。适合您的需求。 OpenCV,MIL等更容易与Qt集成,而不是使用WPF进行P / Invoke调用(这也会因.Net编组而导致延迟)。
答案 2 :(得分:10)
如果你已经有一个很大的C ++代码库,我会说你应该坚持使用Qt。 WPF并不像他们所说的那样令人敬畏,也不像开发那么容易。 C ++和Qt是一个着名的团队,普通的C ++(不是.NET)与WPF不是。
答案 3 :(得分:3)
WPF是UI框架而不是编程语言。您可以在C#或VB .NET中编写WPF应用程序。要使用.NET应用程序中的本机C ++代码,您有两种选择:
PInvoke - 允许从本机库调用普通的C API。 PInvoke不能用于C ++类,只能用于函数。它的工作方式与VB6中的API调用相同。
使用C ++ / CLI包装器,您可以编写可由C#/ VB .NET客户端使用的.NET Dll。在内部,这个Dll使用本机C / C ++库。
如果您对WPF感到满意,并且不需要跨平台解决方案,则可以使用它。您需要学习互操作性部分。 C ++ / CLI是一种非常复杂的语言,但是熟悉原生C ++和.NET的程序员可以学习它。
另一方面,Qt允许直接使用任何现有的C / C ++代码,并提供跨平台解决方案。
答案 4 :(得分:2)
最近几年我一直在使用SWIG在WPF应用程序中提供纯(非托管)C ++ DLL。它工作得很好,没有任何问题,这适用于航空电子设备维护培训师等大型应用。
SWIG很棒,因为有了一组接口文件(根据你的.h头文件编写,非常简单),你可以生成所有的脚手架代码,将你的C ++ DLL导出为多种语言,如C#,Python ,Lua,Java。如果要从C#或Lua扩展C ++类,SWIG会生成所需的代码,它处理跨语言传递异常(因此Lua脚本可能抛出异常,通过C ++层流入并在C#级别被捕获,例如)等等我们永远不必触摸PInvoke(SWIG会做到这一切)。太奇妙了。
这样,相同的SWIG接口允许我们使用WPF(C#,带有.NET 4)用于GUI,一个本机C ++后端(通过SWIG)用于我们必须集成的一些现有库,并嵌入Lua解释器支持脚本应用程序(通过SWIG,相同的.i接口文件和sourceforge上的lua-icxx,以简化与Lua C API解释器堆栈的接口)。
我想知道Qt / QML如何与WPF / XAML相比,这个线程开始2年后。我现在看到Qt3D添加了内置3D,因为WPF已经有一段时间了(现在支持3D画布,没有OpenGL或DirectX)。
答案 5 :(得分:1)
您的WPF代码需要使用C#或VB才能获得设计器和工具支持。通过使用混合模式程序集,C#和C ++之间的互操作非常好,它允许您使用C ++编写模块,该模块可以编译为托管和非托管代码的混合。这为您的本机C ++库提供了类型安全的互操作。
有关混合模式程序集的信息,请参阅here。我们可以为他们担保。
IMO的一个重要考虑因素是WPF学习曲线。如果你能带上你的团队,我相信它会非常高效。
答案 6 :(得分:1)
在WPF场景中,您不会直接从WPF(即xaml视图)直接连接到非托管C ++。您总是希望将C ++模块包装成某种VB或C#托管包装器。 (理论上你就可以使用托管C ++包装,但你会拼了命地做到这一点。)WPF起码需要编写.NET语言瘦视图模型。 WPF不应该直接访问您的非托管代码,因此问题更多的是“.NET应用程序可以与非托管C ++进行交互吗?”肯定答案是肯定的。
http://msdn.microsoft.com/en-us/library/aa984739(v=VS.71).aspx