vanilla C ++应用程序GUI开发的最佳实践

时间:2013-08-22 09:21:27

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

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

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

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

此致!!

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

但是,在本机应用程序中,这种分离可能更难实现。主要是因为没有像Symfony这样的框架已经解决了这些体系结构问题,并且通过遵循既定的约定,可以轻松地将UI和业务代码分开。我没有使用Qt,但据我所知,它主要是一个GUI工具包 - 模型,视图和控制器没有明确定义和集成。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

TLDR :非常认真地考虑为什么不想将代码与例如QT。没有办法混合使用GUI和逻辑,但是使用QS字符串,QProcesses或QThreads等QT类,你的生活可以轻松实现......

如果你设法使用QTs Signal& amp;插槽机制,在某些时候你甚至可能会将原生QT GUI更改为QT Quick(QML),这是一个高度可定制的,具有漂亮的外观和动画等等。

这只是我的意见。