3

我想了解如何将 gui 开发为 vanilla C++ 应用程序。我主要在命令行应用程序方面有经验。到目前为止,我在 C++ gui 方面的经验是 cout 和 cin。我在 WPF 方面有一些经验(只是提到我确实有一些 gui 经验)我希望这将描述我对 gui 的经验水平。现在,我想开发一个需要具有 3D 显示可能性的单独 GUI 的应用程序。当然,GUI API 的选择之一是 Qt。另外,在互联网上阅读了很多东西之后,我认为代码分离将来会很有帮助。

所以,我的问题是:如果我保持我的逻辑尽可能通用(不在我的逻辑中使用 winapi 或 qt)并且只制作 GUI 部分 API 特定(比如 winapi 或 qt),是否有可能。或者我需要在我的逻辑部分添加一些代码,比如逻辑和 GUI 之间的同步。可以说来自 qt 的信号和插槽是可能的,但据我所知,信号和插槽是特定于 qt 的。它们不是标准的 C++。

总之,我的问题是我可以在标准 C++ 中制作我的逻辑(以保持平台/框架独立)并且只设计特定于平台的 GUI吗?如果是,您能否建议一个链接或教程或书籍。示例代码或实现将是“愿望成真”。此外,对代码分离策略的一些见解会很有帮助。

问候!!

编辑:: 我会详细说明我的问题。我有一个应用程序,它有单独的 GUI 和逻辑部分。gui 使用 WinAPI,并且由于使用的通信模式是 windows 消息,以前的用户在 Logic 中创建了一个 HWND 对象,该对象与 GUI 通信。因此,逻辑中有一个 HWND,GUI 中有一个 HWND。我不觉得这种方法令人满意。原因之一是逻辑部分将在后期由非程序员编辑(不多。只是修改常量或更改函数的实现而不更改para或返回值)。所以,我只想将逻辑部分保留为标准格式(尽可能)。所以再一次,任何人都可以帮助我在任何 API 中用 C++ 和 GUI 设计业务逻辑。

4

4 回答 4

2

在阅读了一些主题之后,我发现回答自己的问题并不是一个坏习惯。所以我将分享我得到的答案。

没有使用外部依赖项来构建 C++ gui 应用程序的标准方法。gui 和逻辑部分之间的同步始终是特定于框架的。所以,如果我想开发一个 C++ gui 应用程序,我不能把逻辑部分放在标准 C++ 中。它必须有一些来自外部框架的代码,这些代码将传达逻辑部分和 gui 部分。话虽如此,我通过以下方法找到了自己的方式。我将把我的逻辑部分放在一个静态库中,然后我会将这个库附加到 gui 部分。它将增加 gui 部分的编码,但它将保留标准 c++ 中的基本功能。这种方式(标准 C++ 中的函数库和框架特定代码中的机器操作)对我有用。我希望我走在正确的轨道上。:)

于 2013-10-25T15:01:14.983 回答
1

您可以在很大程度上在 Qt 中编写完全独立的逻辑和 GUI 代码。但是,如果您允许逻辑和 GUI 代码交互,您将能够创建更有用的 GUI。Qt 有很多自己的类(QString、QVector<> 等),但如果您愿意,您可以在大多数情况下忽略这些并使用标准库来代替。

但是,我不认为将 Qt 与逻辑代码完全分开是值得的,因为如前所述,如果它们交互,您将能够构建更好的 GUI。举个简单的例子,你可以编写一个非常简单的 Qt GUI,只有一个窗口和一个按钮;按下该按钮并运行一些逻辑代码。然而,通过更多的交互,您可以使用信号和插槽来更新 GUI 上的进度条,让用户知道逻辑代码已经完成了多远。Qt 也非常便携,允许您为 Windows、Mac 和至少一些 Linux 发行版构建程序。

同样对于您的 3D 显示要求,我最近发现自己正在尝试做类似的事情,并发现这个示例非常有用 - http://qt-project.org/doc/qt-5.0/qtgui/openglwindow.html

于 2013-08-22T09:33:40.770 回答
1

我认为默认情况下,您应该旨在将业务逻辑与表示 (GUI) 代码分开。在 Web 开发中,最常用的模式是MVC,它的原理同样适用于原生应用程序。

但是,这种分离在本机应用程序中可能更难实现。主要是因为没有像 Symfony 这样的框架已经解决了这些架构问题,并且很容易通过遵循既定的约定来保持 UI 和业务代码的分离。我没有使用过 Qt,但据我所知,它主要是一个 GUI 工具包——模型、视图和控制器没有那么明确和集成。

根据所需接口的性质,一个简单的 OpenGL GUI 可能就足够了。这就是我为一个简单的 uni 项目所做的。该项目需要根据 XML 文件中的统计数据显示一个 shapefile。我创建了许多 GUI 小部件 - 按钮、标签等,以及一个封装“业务逻辑”的自定义地图小部件。也许我应该“清理”地图小部件,使其尽可能通用,并将所有业务逻辑移至单独的库,但考虑到业务层非常薄,我认为增加的复杂性会超过好处。

另一个因素是您的技能组合 - 当前以及您想要改进的领域。我对 OpenGL 和 freeglut 更感兴趣,然后是学习 Qt。如果我知道 Qt,我会使用它。

于 2013-08-22T10:24:09.327 回答
0

我已经使用 vanilla C++ 和 QT GUI 完成了一些项目。不将任何 QT 代码混入纯 C++ 内容的想法总是好的,但会带来很多乐趣。通常,您最终会得到一个比您预期的更复杂的 GUI,并且通常希望将它更好/更容易地连接到您的代码。Signals 和 Slots 是让 GUI 与您的代码交互的一种非常好的方式,但随后您开始混合......

TLDR:认真思考一下为什么您不想将您的代码与例如 QT 混合使用。这并不意味着混合 GUI 和逻辑,没办法,但是使用 QStrings、QProcesses 或 QThreads 等 QT 类可以让你的生活更轻松......

如果您设法使用 QTs Signal & Slot 机制进行所有交互,那么在某些时候您甚至可以将您的原生 QT GUI 更改为 QT Quick (QML),它是高度可定制的,具有漂亮的外观和动画等等。

这只是我的看法。

于 2013-08-22T09:36:25.657 回答