Избавиться от объекта бога QMainWindow

Я делаю заявку с тремя библиотеками ITK VTK а также Qt, Поскольку мне нужны все функции в цикле обработки событий и подключении сигналов и слотов, я определил все функции в определении QMainWindow. Теперь объект mainwindow стал громоздким, и я попытался создать разные классы для различной функциональности, но потом все пошло не так main.cpp Идея модульности отсутствует. Можете ли вы предложить, как должна быть структура программы?

1 ответ

Решение

У меня редко есть что-нибудь еще в 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_;
    // ...
}

Как вы выбираете занятия Foo а также Bar и какие члены MainWindow переход на эти новые классы зависит, конечно, от вашего контекста. Но идея состоит в том, чтобы организовать ваш код разумно, чтобы каждый класс имел "ответственность", а затем MainWindow может делегировать каждую работу классу, который отвечает за эту работу. Как и в доме, есть электрики для управления электричеством, сантехники для управления водой и т. Д., И ответственность домохозяйки состоит только в том, чтобы вызывать соответствующих парней для выполнения соответствующей работы. В вашем случае вы, вероятно, хотите, чтобы класс выполнял любую работу, связанную с ITKи класс для выполнения любой работы, связанной с VTKзатем, если они также становятся громоздкими, подразделяют эти классы.

Другие вопросы по тегам