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