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

Posted

技术标签:

【中文标题】如何在 C++ 中构建图形用户界面? [关闭]【英文标题】:How do I build a graphical user interface in C++? [closed] 【发布时间】:2010-11-14 05:38:15 【问题描述】:

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

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

【问题讨论】:

视情况而定。您的目标是哪种操作系统?许多 GUI 框架都是特定于操作系统的。 什么操作系统/平台?或者,如果您对编写跨平台 GUI 应用程序感兴趣,请这样说 - 这些东西对 C++ 产生了巨大的不同... PHP 确实支持编写 GUI 程序。没有理由不能从命令行运行 PHP 程序,并且有一些 gui 库,如 PHP-GTK gtk.php.net 和 PHP-Qt php-qt.org 可以帮助您评估为什么需要 c++。用 c++ 编写 GUI 比使用许多其他语言更难,您可以将 c++ 代码捆绑到可从 Python、C# 或 PHP 调用的库中,或者更容易编写 GUI 的东西。 您的问题是如此广泛,以至于我认为您不仅想要工具包的名称,甚至只是一些教程。您需要一些书籍,这些书籍不仅能给您提供 API 或示例,而且还能真正为您提供概念。 KTC 在下面推荐了一些,但我建议,无论您选择什么工具包开始使用,确保找到一个您也可以阅读的工具包。 “用 c++ 编写 GUI 比用许多其他语言更难”你提出这个说法的依据是什么? 【参考方案1】:

本质上,操作系统的窗口系统公开了一些 API 调用,您可以执行这些调用来执行创建窗口或在窗口上放置按钮等工作。基本上,你会得到一套头文件,你可以在这些导入的库中调用函数,就像你对 stdlib 和 printf 所做的那样。

每个操作系统都有自己的 GUI 工具包、头文件套件和 API 调用,以及它们自己的处理方式。还有像GTK、Qt和wxWidgets这样的跨平台工具包,可以帮助您构建在任何地方都可以工作的程序。他们通过在每个平台上使用相同的 API 调用来实现这一点,但那些调用本机 OS API 调用的 API 函数的实现不同。

它们都有一个共同点,这与 CLI 程序不同,那就是事件循环。那里的基本思想有些复杂,而且难以压缩,但从本质上讲,这意味着你的主类/主函数中没有太多内容,除了:

检查事件队列是否有新事件 如果有,将这些事件分派给适当的处理程序 完成后,将控制权交还给操作系统(通常使用某种特殊的“睡眠”或“选择”或“让出”函数调用) 那么当操作系统运行完毕后,yield 函数将返回,您可以再进行一次循环。

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

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

【讨论】:

"将嵌入式网络服务器集成到您的程序中并拥有基于 html/web 的界面实际上要容易得多。" 视情况而定。如果你想做一些花哨的东西(复杂的 UI、自定义控件、动画等),可以。如果你只是想要一个典型的 GUI(具有通常的控件和原生的感觉),不。【参考方案2】:

有很多可移植的免费 G​​UI 库,每个都有自己的长处和短处:

Qt Dear ImGui GTKmm(基于GTK+) wxWidgets FLTK Ultimate++ JUCE ...

尤其是Qt has nice tutorials 和帮助您入门的工具。享受吧!

但请注意,您应该避免使用特定于平台的功能,例如 Win32 API 或 MFC。这将您不必要地束缚在特定平台上,几乎没有任何好处。

【讨论】:

就我个人而言,我认为对 Win32 API 进行编程很漂亮。比起使用 Qt,我更喜欢它,而这本身就是一个好处。不过,也许这只是我。 我个人的经历正好相反。 Win32 API 给我带来的麻烦比其他任何 API 都多。 @mrduclaw,“我认为对 Win32 API 进行编程很漂亮”。我不惜一切代价尝试编写可移植的代码。 (请注意我使用了“尝试”这个词,因为有例外......)编写不可移植的代码如何被认为是“美丽的”? @Trevor Boyd Smith:我想不同的目标。我专业编写的代码几乎没有一个可能是跨平台的,所以这对我来说从来都不是问题。 百万美元的问题是,制作游戏培训师的人只提供小型 exe,他们的程序有漂亮的 UI,所以我想知道他们如何构建 UI,而不提供这些 3rd 方库?【参考方案3】:

独立于操作系统的算法“三步用 C++ 创建 GUI 应用程序”:

    安装Qt Creator

    创建新项目(Qt Widgets Application)

    构建它。

恭喜,您已经有了第一个 C++ 图形用户界面。

现在您已准备好阅读大量documentation 来创建比“Hello world”GUI 应用程序更复杂的东西。

【讨论】:

过去,我遇到过其他 GUI 对初学者不够友好的问题。但是,Qt 有一些很棒的教程。谢谢推荐!【参考方案4】:

鉴于“以 Windows XP 为例”的评论,那么您的选择是:

通过其 API 直接与操作系统交互,这对于 Microsoft Windows 来说是一个惊喜调用Windows API。 WinAPI 的权威参考是微软的MSDN website。一个流行的在线初学者教程是theForger's Win32 API Programming Tutorial。这方面的经典著作是 Charles Petzold 的 Programming Windows, 5th Edition。

使用平台(包括操作系统和编译器)特定库,例如 MFC,它将 WinAPI 包装到 C++ 类中。对此的参考再次是 MSDN。 Jeff Prosise 的Programming Windows with MFC, 2nd Edition 是一本经典书籍。如果您使用的是 CodeGear C++ Builder,那么这里的选项是 VCL。

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

【讨论】:

MFC 是邪恶的。如果没有其他选择,我更愿意使用 WIN API。 @the_drow 那sourceforge.net/projects/win32-framework【参考方案5】:

既然我已经到了你现在的位置,我想我可以“回答”你。

事实上,制作 GUI 并不容易。 GUI 高度依赖于平台和操作系统特定的代码,这就是为什么您应该开始阅读有关窗口管理 API 的目标平台/操作系统文档的原因。好消息是:有很多库可以解决这些限制并将架构差异抽象到单个多平台 API 中。之前推荐的 GTK 和 Qt 就是其中的一些库。

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

总而言之,还有用于 GUI 开发的非免费“环境”,例如 Microsoft 的 Visual Studio。对于有Delphi 经验背景的人来说,Visual Studio 可能更熟悉。 Microsoft 提供的完整 Visual Studio 环境也有免费的替代品:Visual Studio Express,这对于开始 GUI 开发来说绰绰有余。

【讨论】:

【参考方案6】:

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

【讨论】:

这引入了 Win32 API,这是一种非常低级的 GUI 编程方法,可将您与 Windows 平台联系起来。我不建议这样做。 这是一个有效的选项。我同意这可能不是最好的起点,但不值得投反对票。 我知道这不是理想的解决方案,但它确实有助于了解 Windows 中的 gui 系统是如何工作的。几年前我读过这个教程,现在我知道消息循环是什么以及它是如何工作的。在 .net 中使用 winforms 时,这些知识可能会派上用场。 如果您要编写桌面应用程序,则无法替代了解操作系统如何真正呈现并与用户交互。如果您只是在不了解基础知识的情况下使用库,那么您将永远不会真正了解发生了什么。学习一点低级 win32 gui 编程将是值得的。 @Jim In Texas:我同意,但是这种“低级”应该基础之后学习,所以我仍然觉得这个推荐不适合初学者。跨度> 【参考方案7】:

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

【讨论】:

由于QT授权变更,打算转用QT 我自己的 wxWidgets 程序是 5.9 Mb,甚至里面有所有链接的库【参考方案8】:

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

请参阅MSDN 的以下教程。您可以为 free 下载所需的一切 (Visual C++ Express)。

当然,您将自己与 .NET 联系在一起,但如果您只是在玩游戏或只需要一个 Windows 应用程序,您就可以了(大多数人仍然使用 Windows...目前)。

【讨论】:

以上是关于如何在 C++ 中构建图形用户界面? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 视觉中创建 UI [关闭]

使用 C++ 创建图形应用程序 [关闭]

如何在 C++ 中模块化构建应用程序

Linux操作-关闭图形界面

centos图形界面的开启和关闭

qt图形界面编程如何调用对象指针?