QT-C ++与通用C ++和STL [关闭]


19

最近在Ubuntu QQ上刷了我的C ++。我喜欢所有事物的Qt框架,尤其是构建GUI的框架。在过去几年中使用PyQt时,我对它非常熟悉。

当使用PyQt时,我遇到了一些问题,现在将C ++与Qt一起使用时,问题更加明显:Qt对Qt特定的C ++有很多扩展 -QString只是一个常见的例子,更不用说自动垃圾收集了。完全不了解C ++和STL的情况下,可以使用C ++编写Qt应用程序。

我可能很快就要再次进入就业市场,我希望能够考虑C ++的职位-但我担心自己过多地与Qt绑定会限制我使用通用C ++的能力,这曾经非常强大,但是现在长期处于休眠状态且生锈。

我应该避免Qt吗?使用WxWidgets或GTK ++构建GUI会更好吗?

什么是可以使用的最佳GUI框架,该框架允许/要求最多使用通用C ++和STL?在GUI框架等方面,我如何使自己作为C ++程序员最有市场价值?

Answers:


15

出于这些原因,我不会避免使用Qt。您不需要使用所有Qt的实用程序类。对于那些替换STL的代码,您最多将被迫使用QString,甚至可能使用QStringList。另外,程序通常比GUI具有更多的功能。您始终可以将通用C ++专用于其余程序,而Qt仅用于GUI。

我认为,使用STL的工作更多地是要了解使用了哪些底层数据结构及其复杂性,以及因此在什么时候应该使用每个容器。在谈到C ++编程时,尤其要了解如何使用非常重要的<algorithm>标头,由于它与STL兼容,因此也可以在Qt的容器上使用。

只要您知道(或至少有一个大致的了解)它们是如何在内部实现的,使用Qt提供的所有这些扩展对我来说并没有什么害处。确保知道诸如Q_OBJECT,SIGNAL(),SLOT(),foreach()之类的东西不是魔术,而是扩展为有效C ++语句的宏。例如,了解如何实现使Qt感觉更像Java的隐式共享类和父子关系并不是那么复杂。您总是可以尝试在一个单独的项目中重新创建某些功能,只是看是否可以使用通用C ++来实现,然后在Qt中使用它们就不会感到难过。

另外,看看Boost库。它们提供了标准C ++库所没有的其他实用程序,并且是与通用C ++更加接近的好方法,因为它们实质上遵循与通用C ++相同的约定。有些库具有相当复杂的模板化类,仅尝试了解它们的工作原理本身就是对C ++的很好研究。Boost具有许多Qt中找不到的实用程序,而其他实用程序则实现与Qt某些类相同或相似的概念,并且可以代替它们使用。

如果您确实使用C ++进入了工作市场,那么您很可能将使用Qt或其他与之类似的框架,该框架将拥有自己的实用程序类,这些实用程序类将使C ++变得更简单。


4
+1表示“您始终可以将通用C ++专门用于其余的程序,而Qt仅用于GUI。”
Md Mahbubur Ra​​hman

@MahbuburRAaman-是的-这是很好的建议。仅将Qt用于GUI以及挂钩的必要条件。使用通用C ++,STL,Boost(其余通用工具)编写其余的代码。
矢量

5

我对Qt表示高度评价,但我的问题是,使用哪种最佳GUI框架才能允许/要求最大程度地使用通用C ++和STL?在这方面,Qt有点精神分裂:它复制了STL容器和算法,但有其自身的特点。它还提供了与STL不同的容器。Qt和STL之间的互操作性并不总是一帆风顺。在某些情况下,它需要几个函数调用从获得std::stringQString和背部。

wxWidgets有一个用于STL构建的选项,该选项仅使用STL容器-不存在像Qt这样的具有本地替换的并行Universe。它还可以使用标准的C ++编译器进行编译,而无需非标准的扩展名。这是一个值得考虑的高质量GUI框架。

您还可以看一下gtkmm,它是GTK +的C ++包装器。它比Qt更接近满足您的第一个要求。


1
“ wxWidgets具有用于STL构建的选项,该选项专门使用STL容器...”-我知道-这很重要。“在某些情况下,从std :: string到QString需要一些函数调用”-了解-我尚未对此进行调查。我对GTK和Wx有点熟悉-但相比之下,Qt似乎闪闪发光,至少从我的角度来看-C ++不是我的母语-我来自Clipper / Delphi世界,然后学习了C ++,因为我必须处理Win 32s等
矢量

2

我不会担心不用特定的STL库,例如std :: string或std :: iostream或std :: vector。QT等效项具有不同的味道,但离问题没有什么距离。

在我看来,更多的惯用差异似乎是重new用于分配的编程风格。虽然对于QT程序,这对于Gui部分来说可能很好,但是C ++和RAII的优点是,您实际上可以在堆栈上而不是堆上保留大量数据。当切换为编写非GUI代码时,您应该记住这一点。


1
我要说明的重点不是堆分配通常不好,这对局部变量来说并不是最好的选择。GUI类的寿命通常很长,最好在堆上分配,只需要临时使用的局部变量在堆栈上也可以。在带有Garbace Collection的C#中,它们将很快被销毁,因此堆也可以。但是,使用手动new/delete调用并不是那么容易且容易出错。在关键部分(处理大数据)中,这可能会有所作为,特别是delete调用可能会非常慢。
wirrbel

1
这不是10000个UI对象的问题,而是具有一百万个条目的复杂树数据结构,等等。在这种情况下,曾经有一种方法可以采用更智能的分配方式(批量分配或大量智能编写的boost类,等等)。结论:堆还不错,必须聪明地使用它。Qt方式有时无法扩展其他功能。我认为它仍然是一个很棒的工具包。
wirrbel

那么C ++ 11呢?智能指针等似乎可以减轻您的许多顾虑。我现在才开始弄乱它。正如我所说,我同意Qt KICKS BUTT。我的计划是将Qt用于GUI并使用C ++ 11做我能做的任何事情-例如,这似乎提供了大量的Boost,例如,它已过时并在很大程度上缩小了Java / C#与老式C ++之间的差距。我感到(在一定距离上这时已经可以感觉到)Qt和C ++ 11的组合可以是一个大赢家。
矢量

2
我认为您的意思是:C ++有很多选择,而使用C ++必须明智地选择。智能指针等也有问题。厌倦了C#,您可以看看dlang.org,它做得更好(GCed)。
wirrbel

同时,我必须整理一个支持C ++ 11的工具链。我现在使用Codelite-非常好的IDE-但开箱即用(GNU编译器)它不支持11,因为我刚刚发现...也许可以将兼容11的编译器插入其中。不打算从D或Boo等开始-就像我所说的那样,我可能不得不很快再次打入就业市场,我希望拥有主流的语言来提高市场竞争力,而不是“一次性”。大量的Python作业-太可惜了,我受不了Python!
矢量
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.