如何使用C++创建经典GUI

Sam*_*ler 1 c++ user-interface javafx

是否有一种方法可以使用cpp创建经典GUI,就像JavaFX的情况一样?我想创建像浮动按钮,表格,图形等元素.我知道像qt这样的工具,但我不熟悉它.我试过win32 API,但它只适用于Windows.

Dai*_*Dai 5

GUI库通常被称为"小部件工具包",并且有各种各样的跨平台GUI小部件工具包可用,但是它们对于优秀的用户体验很少是一个好主意,因为不同的操作系统环境具有不同的UI范例(例如macOS和Ubuntu顶部有一个永远在线的菜单栏,而Windows和其他Linux桌面则没有.

因此,您有两个基本选择:

  1. 使用单个跨平台GUI工具包 - 这意味着创建单个GUI项目,但限制您使用该工具包的控件和功能选择,并且通常会使您的用户遇到(相对)较差的用户体验,或者因为您的工具包没有使用本机小部件(例如Java,WPF,Qt)或因为您不能使用平台的本机范例.
  2. 为每个平台编写新的本机GUI.这意味着更多的工作,但更好的用户体验.

对于跨平台GUI工具包,主要选项是:

  • Qt的
  • GTK +
  • wxWidgets的

有关三者之间的比较,请参阅此QA:哪些(如果有)实现Windows本机外观:GTK +,wxWidgets,Qt,FLTK?

(TL; DR:WxWidgets使用本机控件但难以开发; Qt提供最佳的开发人员体验,但还有许多其他需要注意的要点)

对于您需要定位的每个平台的本机UI,您需要熟悉每个API:

  • Win32的:
    • MFC(API因现代标准而丑陋,但确实封装了主要的Win32 UI范例和API,例如Common Controls.但是,要准备好迎接最新的UI功能,例如High-DPI,bi-定向文本和高质量的2D渲染.GDI/GDI +即将推出,这意味着使用Direct2D - 这很有趣,因为MFC假设GDI)
    • UWP/XAML:如果您的应用程序可以沙箱化(并且仅在Windows 10上运行),那么您应该好好看看UWP/XAML(它都是原生的,因此不涉及CLR).
    • WPF:如果您对依赖.NET Framework并在C#中编写UI代码的应用程序感到满意,那么使用WPF可以更轻松地创建高质量的用户界面 - 但是,无皮肤的WPF应用程序的视觉美感对Windows 10采取了急剧下降(即它们很丑陋)而且WPF的默认控制设置非常不稳定 - 但如果你有手段(即时间,金钱,人)那么你可以获得很好的结果 - 并作为奖励XAML for WPF通常可移植到UWP.
  • macOS:Cocoa - 你很难用C++做这件事.如果您的目标是macOS,我强烈建议您在Swift中编写UI层(如果必须,则使用Objective-C),然后使用C++桥连接到其余的应用程序代码.
  • Linux:由于Linux只是一个内核,一组"本机"小部件取决于用户的桌面环境 - 但大多数桌面程序似乎都使用GTK.如果您打算使用GTK,那么您也可以使用GTK的跨平台功能来支持Windows和macOS.

总之:这很困难,也很多工作.:) - 并解释为什么今天(2017年中)的许多软件标题通常直接在网络上构建为Web应用程序(例如Facebook,StackOverflow,SalesForce)或使用Electron(例如Slack,VS Code,Atom)或某些东西的托管Web视图其他托管网络(PhoneGap应用程序,Spotify等).