如何在C ++中构建图形用户界面?[关闭]


270

到目前为止,我所有的C ++程序都一直在使用命令行界面,而我所遇到的唯一其他语言是不支持GUI的PHP。

我从哪里开始使用C ++进行图形用户界面编程?如何创建一个?


4
这取决于。您要定位哪种操作系统?许多GUI框架都是特定于OS的。
Michael Ratanapintha 09年

3
什么操作系统/平台?或者,如果您有兴趣编写跨平台的GUI应用程序,请这么说-这些东西对于C ++来说有很大的不同...
Shog9

3
PHP确实支持编写GUI程序。没有理由不能从命令行运行PHP程序,并且有类似PHP-GTK gtk.php.net和PHP-Qt php-qt.org的 gui库可以帮助您。您还可能希望评估为什么需要C ++。用c ++编写GUI的难度比使用许多其他语言要难,并且您可以将c ++代码捆绑到可从Python或C#或PHP调用的库中,也可以将GUI编码起来更容易一些。
kibibu

6
您的问题如此广泛,以至于我想您不只是想要工具箱的名称,甚至不只是一些教程的名称。您需要一些,比API或示例给您更多的,而实际上给您一些概念。KTC建议使用以下工具,但我建议您选择开始使用的任何工具箱,请确保找到您也可以阅读的工具箱。
夸克

6
“用c ++编写GUI比用许多其他语言编写GUI更为困难”。
piotr

Answers:


163

本质上,操作系统的窗口系统公开了一些API调用,您可以执行这些API调用来执行诸如创建窗口或在窗口上放置按钮之类的工作。基本上,您会获得一组头文件,并且可以在导入的库中调用函数,就像使用stdlib和一样printf

每个操作系统都带有自己的GUI工具包,头文件套件和API调用,以及它们自己的处理方式。还有诸如GTKQtwxWidgets之类的跨平台工具包,可帮助您构建可在任何地方运行的程序。他们通过在每个平台上具有相同的API调用来实现此目的,但是对于那些调用本机OS API调用的API函数,则采用不同的实现。

他们都将拥有一个共同点,这与CLI程序有所不同,这就是事件循环。那里的基本思想有些复杂,并且很难压缩,但是从本质上讲,这意味着在您的主类/ main函数中不会发生很多麻烦,除了:

  • 检查事件队列中是否有新事件
  • 如果存在,则将这些事件分派给适当的处理程序
  • 完成后,将收益控制返回给操作系统(通常使用某种特殊的“睡眠”或“选择”或“收益”功能调用)
  • 然后,当操作系统完成后,yield函数将返回,并且您需要执行另一个循环。

有很多有关基于事件的编程的资源。如果您有使用JavaScript的经验,那么它是相同的基本思想,除了脚本编写者无法访问或控制事件循环本身或存在哪些事件之外,您唯一的工作就是编写和注册处理程序。

您应该记住,GUI编程通常非常复杂和困难。如果您可以选择,将嵌入式Web服务器集成到程序中并具有基于HTML / Web的界面实际上要容易得多。我遇到的一个例外是Apple的Cocoa + Xcode +界面构建器+教程,使它成为我所见过的GUI编程新手最容易接近的环境。


实际上,将嵌入式Web服务器集成到您的程序中并具有基于html / web的界面实际上要容易得多。 ”这取决于。如果您想做一些花哨的东西(复杂的UI,自定义控件,动画等),可以。如果您只是想要一个典型的GUI(具有通常的控件和本机的感觉),则不会。
橡子

167

有很多免费的可移植GUI库,每个都有自己的优点和缺点:

特别是Qt拥有不错的教程和工具,可以帮助您入门。请享用!

但是请注意,应避免使用平台特定的功能,例如Win32 API或MFC。那将您不必要地捆绑在特定平台上,几乎没有好处。


25
我个人认为,使用Win32 API进行编程非常漂亮。我比使用Qt更喜欢它,这本身就是一个好处。也许那只是我。
mrduclaw

6
我的个人经历恰恰相反。Win32 API给我带来的麻烦比其他任何API都多。
vog 2010年

17
@mrduclaw,“我认为使用Win32 API进行编程非常漂亮”。我不惜一切代价编写可移植的代码。(请注意,我使用了“ try”一词,因为有例外...)如何将不可移植的代码视为“美丽”?
特雷弗·博伊德·史密斯

11
@特雷弗·博伊德·史密斯(Trevor Boyd Smith):我想是不同的目标。我曾经专业编写过的代码几乎都不可能是跨平台的,因此这对我来说从来都不是问题。
mrduclaw

1
一百万美元的问题是,做游戏培训师的家伙只提供小exe文件并且他们的程序有漂亮的用户界面,所以我想知道他们是如何建立用户界面的,他们不提供这些第三方图书馆的东西吗?
user889030

74

与操作系统无关的算法“ 分三步在C ++中创建GUI应用程序 ”:

  1. 安装Qt Creator

    在此处输入图片说明

  2. 创建新项目(Qt Widgets应用程序)

    在此处输入图片说明

  3. 建立它。

恭喜,您已经有了C ++的第一个GUI。

现在,您准备阅读大量文档,以创建比“ Hello world” GUI应用程序更复杂的内容。


过去,我对其他GUI不够初学者友好时遇到了麻烦。但是,Qt有一些很棒的教程。谢谢你的推荐!
JD

23

给定“以Windows XP为例”的注释,那么您的选择是:

  • 通过其API直接与操作系统进行交互,对于Microsoft Windows而言,这是一个意外的意外调用Windows API。WinAPI的权威参考是Microsoft的MSDN网站。一个流行的在线初学者教程是TheForger的Win32 API编程教程。最经典的书籍是Charles Petzold的《Programming Windows,第5版》

  • 使用平台(在OS和编译器方面)特定的库,例如MFC,它将WinAPI包装到C ++类中。再次参考是MSDN。关于这方面的经典书籍是Jeff Prosise的《使用MFC编程窗口》,第二版。如果您使用的是CodeGear C ++ Builder,则此处的选项为VCL

  • 使用跨平台库,例如GTK +(C ++包装器:gtkmm),QtwxWidgetsFLTK包装了特定操作系统的API。这些优点是,通常来说,您的程序可以针对不同的OS进行编译,而无需更改源代码。正如已经提到的,它们每个都有自己的优点和缺点。选择使用哪个许可证时要考虑的一个因素是许可证。对于给出的示例,GTK +&gtkmm是LGPL的许可,Qt是各种许可(包括专有选项),wxWidgets是其自己的wxWindows许可(已重命名为wxWidgets Licence),FLTK是LGPL的例外。有关参考,教程和/或书籍,请访问每个人的网站以获取详细信息。


9
MFC是邪恶的。如果没有其他选择,我希望使用WIN API。
the_drow


18

由于我已经到过你现在的位置,我想我可以“回答”你。

事实是,没有简单的方法来制作GUI。GUI高度依赖于平台和OS特定的代码,这就是为什么您应该开始阅读有关窗口管理API的目标平台/ OS文档的原因。好处是:有很多库可以解决这些限制,并将抽象体系结构的差异集成到单个多平台API中。之前建议的GTK和Qt是其中的一些库。

但是,即使这些也有点复杂了,因为同时引入了许多新概念,数据类型,名称空间和类。因此,它们通常与某些GUI WYSIWYG编辑器捆绑在一起。它们几乎使带GUI的编程软件成为可能。

总结起来,还有一些非免费的GUI开发环境,例如Microsoft的Visual Studio。对于那些具有Delphi经验的背景,Visual Studio可能会更熟悉。Microsoft还提供了完整的Visual Studio环境的免费替代方案:Visual Studio Express,对于开始GUI开发而言,这已经绰绰有余了。


15

我找到了一个带有“简单”教程的网站:http : //www.winprog.org/tutorial/start.html


8
这引入了Win32 API,这是一种非常底层的GUI编程方法,可将您与Windows平台联系在一起。我不建议这样做。
vog

17
这是一个有效的选择。我同意,这可能不是最好的起点,但是却不值得一票。
Emil H

1
我知道这不是理想的解决方案,但确实有助于了解Windows中的gui系统如何工作。几年前,我已经阅读了本教程,现在我知道消息循环是什么以及它如何工作。在.net中使用Winforms时,此知识可能会派上用场。
ZippyV

7
如果您要编写桌面应用程序,那么知道操作系统如何真正呈现用户并与用户交互就无可替代。如果您只是在不了解基础知识的情况下使用库,那么您将永远无法真正理解正在发生的事情。学习一点低级的win32 gui编程将花费很多时间。
Jim in Texas

@Jim在得克萨斯州:我同意,但这种“低水平位”应该学习的基础知识,所以我仍然觉得不恰当的建议初学者。
vog

3

用C ++创建.NET Windows GUI很容易。

请参见MSDN的以下教程。您可以下载你需要的一切(的Visual C ++ Express公司)免费

当然,您可以将自己绑定到.NET,但是如果您只是在玩耍或只需要Windows应用程序,那很好(大多数人现在仍然拥有Windows ...)。


3

我使用FLTK是因为Qt不是免费的。我不选择wxWidgets,因为我的第一个测试是使用简单的Hello World! 程序产生的可执行文件为24 MB,FLTK为0.8 MB ...


4
由于QT许可证的更改,我计划切换到QT
pernecker

2
我自己的wxWidgets程序为5.9 Mb,即使其中包含所有链接的库
msangel 2014年
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.