用户界面-如何去gui一个复杂的纠缠c++ /Qt4应用程序

user interface - How to de-GUI a complex tanglewad C++/Qt4 app?

本文关键字:纠缠 复杂 c++ 应用程序 Qt4 一个 何去 gui 用户界面      更新时间:2023-10-16

我们有一个用c++和Qt4编写的大而混乱的应用程序,许多库依赖,数百个类,没有连贯的结构。它通常作为GUI应用程序以交互方式运行,但有时它以一种不干涉的方式从另一个程序启动,该程序为其提供命令行选项并通过dbus与之通信。GUI仍然显示,但没有人或训练有素的猴子在那里点击任何东西。"放松并观看闪烁的灯光",无论是交互式的还是自动的,当运行时,应用程序写入图像文件。

我接下来几周的工作是添加一个"无gui"功能,这样应用程序就可以在不显示gui的情况下以不干涉的方式运行并编写其图像文件。在内部,要编写的图像是使用QImage和其他非GUI Qt对象制作的,但是这些对象被其他对象所拥有,这些对象确实涉及Qt的GUI类。在几次尝试理解混乱之后,我找不到一种方法来解开诸如让应用程序在没有完整GUI运行的情况下创建图像之类的事情。有一段时间,我希望我能设置xxx。可见= false;对于所有xxx的GUI对象,但这是不实际或不可能的(AFIK)。

在这个应用程序中添加这个无gui功能有什么通用策略吗?一些不需要深入重新设计类层次结构的技术?

漫长而艰难的方法是找出逻辑是什么以及如何执行的,将逻辑提取到一些基于QObject的类(带有信号和插槽),并使其成为QtCore应用程序。我知道这没有帮助,但这是correct的方式。

如果不能将所有GUI元素设置为隐藏(或者可能只有QMainWindow?),那么这是您唯一可以做的事情。

Qt允许您这样做,但如果原始编码器没有计划这一点,您将有很多重构/重新编码要做。

这实际上取决于程序是如何编写的。如果逻辑在某种程度上与接口分离,那么它可以像找出从QMainWindow类继承的类并确保从未初始化一样简单。

在逻辑遍布的情况下,我强烈建议尝试将所有逻辑转换为signalslot的形式(考虑到这是一个GUI应用程序,可能已经发生了),然后只是不初始化QMainWindow实例并手动调用这些。

尝试子类化接口类(QMainWindow, QDialog等),并在那里实现您的逻辑。