使用Qt,有什么好方法可以分解包含GUI逻辑的大型源文件

With Qt, what are good ways to break up a large source file containing GUI logic?

本文关键字:GUI 包含 源文件 大型 分解 Qt 什么 方法 使用      更新时间:2023-10-16

我正在C++中使用Qt 5进行一个项目,它有一个包含大量UI元素的复杂窗口。此窗口是使用Qt设计器设计的,是从UI文件加载的。

我发现Qt的典型模式是在其主要的、包含类中为窗口的UI编写所有逻辑;即文件中的"单一继承方法"。例如,您有一个名为QMyWindow的类和一个定义布局的相应QMyWindow.ui文件,其中QMyWindow包含ui的所有逻辑,主要是在使用自动连接的槽内方法(即命名为on_objectName_signalName之类的方法)。对于没有太多复杂性的简单窗口,这很好。然而,对于大型、复杂的窗口,将所有内容放在一个类中的模式开始崩溃,因为文件变得太大且杂乱无章。

我的大型复杂窗口的源文件现在已经超过3000行了。我已经将该窗口的所有实际功能分解为其他类,所以这3000行代码主要只是完成UI的繁重工作。从本质上讲,这些都是有意义的东西,放在窗口类的权限之下。太多了。

使用其他语言和GUI工具包,我可以非常有效地将窗口分解为逻辑部分。例如,在iOS或OS X应用程序中,我可以在故事板文件中使用嵌入式控制器,使我能够以逻辑的方式分解多个控制器之间的逻辑,并且仍然可以对UI本身进行所见即所得的编辑。

但我不知道使用Qt有什么好方法可以做到这一点。我在QtDesigner中找不到任何东西可以将单个UI文件分解为由多个类处理的多个部分。如果我自己编写创建和布局UI的代码,我当然可以做到这一点,但qmake从设计器文件生成的结果代码创建了一个UI名称空间和一个setupUI函数,用于创建包含窗口中的所有内容。我看不出你怎么能把事情拆开,继续使用自动连接。

Qt中有一些机制可以动态加载几个设计器文件,然后将它们嵌入到一个小部件中,但如果我使用它,我将a)极大地增加代码的复杂性,b)失去我不想做的所见即所得的编辑。

这里有什么好的选择吗?我不想保留一个3000多行的难以导航的文件,但我不知道如何将其分解,并仍然按照预期的方式使用Qt的工具,尤其是Qt Designer。

3000行代码不是问题,不完全确定您为什么不这么想。

无论如何,在一个"单元"中处理非常复杂的UI是个坏主意。您应该将一个巨大的UI模块化为不同的UI,并将它们组合在一起。

总而言之,我建议不要使用UI设计器,而是完全用代码编写UI。但是,即使您已设置使用设计器,也可以注册您的自定义小部件以供使用。