一个学生用C++编程想学习写GUI,使用哪个更好:C#还是QT?

14

我是一名大学计算机科学的教师。这门课基于Cormen和Knuth,教授学生们使用C++编程算法。但有时通过GUI展示算法的工作原理或仅仅任务结果是有好处的。在我看来,能够编写完整的程序非常重要。他们将修读GUI相关的课程,但是需要三年后才会毕业。因此,我认为他们应该能够更早地编写简单的GUI应用程序。因此,我想教他们。

你认为对他们来说哪个更有用:使用QT编程GUI还是用C#编写GUI并调用非托管的C++库?

更新。

学生使用MS Visual Studio开发C++应用程序,因此C#已经安装了。但据我所知,QT也可以集成到VS中。

我有以下关于C#的优点(其中一些是答案中提出的):

  • 需要创建一个额外的层次。这需要更多的工作,但它强制你显式地指定GUI和处理数据之间的契约。GUI和算法之间的边界变得非常清晰。
  • 在雇主中更受欢迎。至少在我们生活的俄罗斯,它相当普遍。在C#应用程序/ASP.Net网站中编写性能关键的算法并从其中调用PInvoke是很常见的。也许在世界其他地方不是那么普遍,但在俄罗斯,由于某些原因,Windows非常受欢迎,特别是在公司和企业中,因此大多数b2b应用程序都是Windows应用程序。
  • 快速开发。由于许多原因,在.Net中编码比在C++中编码要快得多。

缺点是它是一门新语言,对学生来说具有自己的特定性。而且需要处理与库的调用的混乱。

7个回答

14
最好让学生熟悉Qt,因为Qt实际上是C ++。 C#是完全不同的东西,如果您使用C#,很可能会让学生困惑于哪些是Microsoft或C#特定的事物,而哪些实际上是在ISO C ++标准中定义的,而只使用C ++则更加明显。此外,Qt和C ++是可移植的,因此使用Mac OS X或Linux的学生将感谢您选择了跨平台框架(Qt也适用于Windows);而如果您使用C#,则会强迫您的学生使用Windows(是的,有Mono,但它在跨平台方面的表现远不如Qt)。
您可能还对使用我的C ++项目模板感兴趣,该模板提供了足够的基础设施,以便使用CMake在C ++中开发Qt GUI应用程序,并已经在Mac OS X和Ubuntu Linux下进行了测试和验证(如果我收到Windows反馈,我也会确保它在那里运行)。该模板包括一些代码,当使用“--gui”命令行选项运行时,会在Qt中引导出一个“Hello World”GUI。

有人问我在使用Mono时遇到了什么问题,那么,这里就来说一下...我正在使用Mac OS X 10.6 Snow Leopard。我在让Mono工作方面遇到了很多困难,最终放弃了它。对于OS X用户来说,还存在一个疑惑,即是使用DMG还是使用MacPorts安装Mono更好。而且,它甚至比Qt SDK(Qt SDK已经很大了)还要大。至少对于Qt来说,有一个选项可以只安装QtCore和QtGUI框架(如果使用Qt Framework而不是QtSDK包)。 - Michael Aaron Safyan
顺便提一句,如果Novell为Mac OS X提供官方的Mono发行版,为什么您还会考虑使用MacPorts呢? :-) - Franci Penov
@Franci,我通常使用MacPorts安装软件,因为如果我想要安装任何依赖于Mono的东西,MacPorts会自己安装一个Mono的副本,所以最好使用MacPorts一次性安装。此外,使用MacPorts的好处是更容易更新已安装的软件,并且不需要担心依赖关系,因为MacPorts会自动获取和安装依赖项。尽管如此,在某些情况下,使用MacPorts而不是DMG是一个坏主意... Mono、Qt和MySQL就是应该避免使用MacPorts的例子。 - Michael Aaron Safyan
在我的情况下,所有的学生都使用Windows。至少到目前为止。@Michael,感谢您提供使用您的项目的机会,我将下载并尝试。 - flashnik
除了Michael的反-Mono笔记之外,Mono似乎为非Windows用户提供了可怕的用户体验。我在Linux上使用带有Mono的KeePass,它看起来像是有人把Windows XP UI的一个非常糟糕的仿制品塞进了Linux中,而不是使用本地主题设置。另一方面,它使用了我的一些主题设置,所以例如,我得到了灰色文本上的白色菜单。也许这是一个KeePass问题,而不是一个Mono问题,但这让我非常怀疑使用Mono进行跨平台GUI开发。例如:http://twitpic.com/198c8f - davidtbernal

6
我建议使用Qt,因为它是C++而不是C#。
在C++和C#之间进行接口交互可能会很混乱,我认为这可能会分散学生对算法的注意力(就像你说的那样)。

1

Qt -- 从C#使用C++库的P/Invoke添加了一个你甚至不想考虑的完全不同的层面的无意义。如果你要使用.NET,考虑使用C++/CLI可能会更值得,它可以链接托管和本机代码,使得这个过程变得容易得多


1
我不想使用C++/CLI来避免在以后编写本机C++应用程序时出现C++特定语法和混淆。因此,使用C#更好,因为它与C++明显区分开来。附加层也有积极的意义-在GUI和算法/处理数据之间建立清晰的边界,并明确指定契约。 - flashnik
在我看来,C#与C++之间的区别不够明显,因此没有太多用处,而P/Invoke也没有以任何有意义的方式强调契约——你想教授关于DbC(或类似内容)的任何东西都会被忽略。 - Jerry Coffin

1

我会使用C#来处理GUI方面的事务。

目前市场上C#的工作机会比使用Qt的C++更多,所以为什么不让他们为毕业后最有可能遇到的东西做好准备呢?

我经常看到学术界存在的一个问题是没有教授现实世界中使用的东西。当然,所有其他的东西都很酷,我个人也喜欢它。然而在学校之后获得真实世界使用的经验才是我的优先考虑。

此外,我认为询问一群程序员通常不是这个主题上最好的建议来源。我会看一下你所在地区大多数公司正在招聘的技术,对于大多数桌面GUI的应用程序来说,很可能是.NET或Java。


3
我不同意。学生们将会过于担心处理未受管理的代码而无法专注于开发GUI。 - snicker
@snicker - 如果他们正在编写某种企业级应用程序,我会同意,但对于他们正在处理的复杂性,我认为这样做是可以的。 - TWA
实际上,需要使用Qt的工作正在涌现,所以它并不是那么神秘。 - Peter Alexander
1
说实话,与.NET相比,Qt是一个统计上的异常值。 - TWA

1

使用C#编写GUI并调用未托管的C++库,因为VS是一个很好的起始IDE,而.NET是现有最全面的库集。这假定您的学生可以访问Windows计算机。如果他们在Linux上,那么QT是可行的方案。


我们即使是进行C++编程也使用VS,所以这不是问题 :) - flashnik

0

这里有一个疯狂的想法,用C#为GUI应用程序重写算法。这样做有两个目的,1)它可以很好地避免整个P/Invoke、C++/CLI或COM的混乱,只是为了绘制一些漂亮的图片;2)与使用Qt不同,它给你机会强调算法、程序和编程语言之间的区别。


不,用C#编写算法是不可接受的。C/C++适合计算/算法,而.Net适合快速和安全的开发。 - flashnik
如果您认为在C#中编写算法是不可接受的,那么您一定使用了非常奇怪的“算法”定义。或者世界上有很多“不可接受”的C#代码。您可以在C#中实现CLRS中的每个算法。事实上,大多数算法都是用伪代码描述的!我对CS教师采取这种态度感到有些不安。 - Logan Capaldo
我的意思是,从课程结构的角度来看,这是不可接受的。两年课程的主要目标是教他们在C++中编写有效的算法。当然,它们可以被改写成C#,但由于C#的安全性,它们会变得不那么有效(例如,CPU使用率)。 - flashnik

0

我认为在这里创建C++/C#非托管/托管混合应用程序没有任何意义。

对于教学来说,如果学生不必学习新的编程语言来使用Gui,则肯定会更容易。而且托管和非托管代码之间以及不同语言中的不同类型之间的接口将使事情变得不必要地复杂。很多时间和精力将浪费在这些话题上,无助于任何人学习课程的主题——算法。

此外,我认为仅有极少数项目将使用C++/C#混合。如果您在C#中完成GUI,则还将使用该语言完成其背后的逻辑。我不认为在C#中创建C++应用程序的GUI会有什么好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接