摆脱QMainWindow的上帝对象

时间:2013-06-13 06:06:19

标签: qt vtk modularity itk god-object

我正在使用三个库ITK VTKQt制作应用程序。由于我想要事件循环中的所有功能以及信号和插槽的连接,所以我在QMainWindow定义下定义了所有功能。现在mainwindow对象变得笨重,我试图为不同的功能制作不同的类,但是main.cpp模块化的想法中的所有东西都在缺失。你能否建议一个程序的结构应该如何?

1 个答案:

答案 0 :(得分:3)

我在main.cpp中除了创建和显示QMainWindow,然后调用app.exec()之外,我很少有更多内容。

如果您的QMainWindow开始变得笨重,那么这意味着您应该将此代码组织到不同的连贯类中(而不是将其移动到main.cpp)。基本思想是更改看起来像这样的代码:

class MainWindow : public QMainWindow
{
public:
    void doSomething();
    void foo1();
    void foo2();
    void foo3();
    void bar1();
    void bar2();
    void bar3();

private:
    // ...
}

代码如下:

class Foo:
{
public:
    void doSomething1();
    void doSomething2();
    void doSomething3();

private:
    // ...
}

class Bar:
{
public:
    void doSomething1();
    void doSomething2();
    void doSomething3();

private:
    // ...
}

class MainWindow : public QMainWindow
{
public:
    void doSomething();

private:
    Foo foo_;
    Bar * bar_;
    // ...
}

如何选择班级FooBar以及您转移到这些新班级的MainWindow成员取决于您的上下文。但是我的想法是巧妙地组织你的代码,以便每个类都有“责任”,然后MainWindow可以将每个工作委托给负责这项工作的类。就像在房子里一样,有管理电力的电工,管理水的管道工等等......管家的责任只是打电话给合适的人做适当的工作。在您的情况下,您可能希望课程执行与ITK相关的任何工作,以及执行与VTK相关的任何工作的课程,如果它们变得笨重,则细分这些课程。