【问题标题】:Best Practise for GUI development for vanilla C++ applicationvanilla C++ 应用程序的 GUI 开发最佳实践
【发布时间】:2013-08-22 09:21:27
【问题描述】:

我想了解如何将 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 设计业务逻辑。

【问题讨论】:

  • 搜索模型视图控制器“模式”和表示抽象控制“模式”。这会对你有所帮助。
  • @PermanentGuest 我知道这些设计模式。我正在寻找的是不是特定于 api 的 C++ 实现。
  • @user21071987 关于“将逻辑部分保持为标准格式”的评论:如果您要引入几个信号和插槽,这不会对您的代码产生太大影响。此外,您使用 C++,编写自己的类 - Qt 类与此没有什么不同。无论如何,一个人必须查找成员函数和类似的东西......

标签: c++ qt user-interface coding-style


【解决方案1】:

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

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

【讨论】:

  • 真的很好奇你的方法。它仍然很好/有效吗?我之前确实有同样的想法,但后来,我坚持/遵守我的框架规则。并且只需将我的所有逻辑都放在我的框架所需的默认方式中。当我真的需要将逻辑与 GUI 分开时,肯定会有特殊的场合。例如,当我希望自己的 Windows 服务调用相同的逻辑时。
  • 我不得不说我也加入了你们的联盟。我开始开发原生 C++ 内核,但后来开始广泛使用 Qt。主要是因为我需要为作为内核一部分的特定设备使用 Windows 消息。但我仍然坚持将其设为静态库。
【解决方案2】:

您可以在很大程度上在 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

【讨论】:

  • 高五! (什么?由于评论中的最低字符要求,我无法发布简单的高五?:-)
  • @HWende 这个网站上的“高五”按钮的形状像一个向上的箭头,位于帖子的左侧。
  • @CodyGray 好吧,我不一定比我更喜欢你的帖子... :-)
  • @HWende 也给你高五!
  • 我的 gui 不会很复杂。或多或少是显示(用户不需要做太多)。我的困惑在于gui和逻辑的同步。如果我开发单独的 gui(使用 qt)和基本的 C++ 应用程序,我如何连接它们?
【解决方案3】:

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

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

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

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

【讨论】:

  • 你升级到连接你的 gui 和逻辑了吗?
  • @user21071987 我只是用函数指针来实现事件——不是很聪明,但很简单;我正计划切换到boost::signals2,我认为这是此类任务的正确解决方案。
【解决方案4】:

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

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

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

这只是我的意见。

【讨论】:

  • 我已经编辑了我的问题。它可能会告诉你使用 vanilla C++ 背后的原因。另外,您是否实现了类似的东西,例如,vanilla C++ 中的逻辑和其他 api 中的 gui,例如 Qt?你是如何连接它们的?您有实施或其他参考吗?
  • @user21071987 你可以编写一个 QT C++ 包装类来调用你所有的函数等。然后你可以在这个包装类中使用 Signals & Slots 来连接 GUI。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多