【问题标题】:How to split large qmainwindow code (if necessary)?如何拆分大型 qmainwindow 代码(如果需要)?
【发布时间】:2019-09-12 22:59:35
【问题描述】:

我有一个包含很多小部件的 MainWindow,请参见下图(抱歉删除了名称)。

如您所见,该窗口由一个选项卡小部件组成,每个选项卡中都有一个工具箱小部件。工具箱小部件中的每个页面都包含一些按钮和一个树形小部件。不同选项卡和不同页面上的树小部件可以相互影响。至此,我已经编写了部分 ui 信号处理代码,基本上只是在 mainwindow.cpp 中编写动作。然而,代码已经变得相当大(1445 行),而我认为我只编写了 1/4。

我在多个地方读到过这么大的文件通常意味着代码设计不正确。所以我的问题是: 将所有的 ui 信号处理写在一个最终可能包含 6000 多行的文件中是否有问题?

如果是的话,请您给我一些工具,让我知道如何使它更小。目前,我实际上有一个包含多个源文件的标头,以便更好地概览。但是根据某些人的说法,这仍然意味着您的代码设计不当。我可以制作更多课程,但我只是不知道如何(尤其是因为我的页面相互依赖)。我虽然关于创建一个具有 Ui::MainWindowClass 对象作为成员的类,但这里的问题是我将失去最大限度地使用 VS19 的能力,因为不再识别 ui 小部件,即 VS 不会列出所有输入 ui-> 时的小部件。

我知道以下问题:With Qt, what are good ways to break up a large source file containing GUI logic? 但我如何模块化它(如果需要)对我来说还不够清楚。

编辑:我喜欢继续使用 Qt Designer。我不确定这是否有什么不同。

【问题讨论】:

  • 6000 行文件对编译器来说不是问题(至少在现代机器上不是);对于人类读者/维护者来说,这可能是个问题。如果你想让它更小,要做的一件事是查看代码中彼此相同(或几乎相同)的代码部分;当你找到它们时,看看你是否可以重构以便删除冗余代码(例如,通过将代码移动到一个单独的函数中,该函数可以从多个位置调用,可能使用不同的参数,而不是保留多个代码副本)
  • @JeremyFriesner 我确实在某个时候已经这样做了。这在当时为我节省了大约 150 行。但确实总是一个好主意要牢记!
  • 我喜欢继续使用 Qt 设计器。我不确定这是否有什么不同。应该没有什么不同。
  • @drescherjm 你能向我解释一下我将如何制作 Fereanor 描述的自定义小部件吗?

标签: c++ qt


【解决方案1】:

您可以将选项卡小部件分解为单独的小部件/类,甚至可以将选项卡小部件设为一个单独的类来处理其选项卡的初始化,这当然取决于您的代码,但您可以将代码分解为子类

【讨论】:

    【解决方案2】:

    如果这对 mainwindow.hmainwindow.cpp 只包含 MainWindow 实现而没有其他可以在其他地方实现的,我看不出它是怎么回事没有看到代码就称为糟糕的设计。行数无法说明是否有必要/合理。
    如果MainWindow 实现很重,将其拆分为多个文件可能会使事情变得更糟(或者更好,这取决于)。

    一个好的做法是单独定义您的自定义子小部件并将它们包含在应该使用它们的地方。它们不需要分别在mainwindow.hmainwindow.cpp中声明和定义。
    更清楚地说,您可以在 mycustomtabwidget.h 中定义 MyCustomTabWidget 并在 mycustomtabwidget.cpp 中实现其行为,然后在 mainwindow.h 中包含标头em>(因为MainWindow 应该有一个MyCustomTabWidget 数据成员)。

    顺便说一句,有很多行不是问题,它只会使编译持续时间更长。我已经使用过包含大量长文件的软件,这些文件总共有大约 100 万行(是的,有点地狱)。
    它工作正常,编译显然只需要比 10 行代码更多的时间。
    另一个不便之处是代码变得更难阅读/维护。但有时,我们别无选择,有时,我们有。视情况而定。

    【讨论】:

    • 我是否正确地说一个自定义子小部件可以是工具箱小部件的一页?此外,如果我创建子类,我就不能再使用 Qt 设计器了,对吧?
    • 一个额外的补充,我是 C++ 或面向对象编程的新手,我的一般意见是,如果你使用许多类,它更容易变得更混乱而不是更清晰。但我认为这只是源于我只使用程序语言编码的习惯
    • @C.Binair 你是对的,每个页面都是一个小部件。您可以单独定义它。但是,当您必须拆分或不拆分时,由您来定义限制。但是拆分一个可以在其他地方重用的小部件(即使它不是但可能是)是一种很好的做法。
    • 我从未使用过 Qt 设计器,所以我不知道您是否能够在主 ui 文件中导入自定义小部件。
    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多