【发布时间】:2016-06-23 20:46:21
【问题描述】:
我想把这个项目Qt Calculator Example 分成GUI 模块和业务逻辑模块。最好的方法是什么?最好只用 C++ 编写逻辑模块,这样我也可以在其他 IDE 中使用它?
【问题讨论】:
-
MVC 模式,结合模型不应使用 Qt 类型的规则,将带您走向正确的方向。
标签: c++ qt module calculator
我想把这个项目Qt Calculator Example 分成GUI 模块和业务逻辑模块。最好的方法是什么?最好只用 C++ 编写逻辑模块,这样我也可以在其他 IDE 中使用它?
【问题讨论】:
标签: c++ qt module calculator
在您的案例中,最佳实践或设计模式是GRASP Controller 模式。
在你的情况下 - 这意味着你应该将 Calculator 类与 Qt 的东西(如 QWidget)完全分开。
所以 - 如果你需要从 Calculator 向 Qt 小部件展示一些东西 - 创建和使用像 CalculatorPresentationInterface 这样的界面。
要获得一些回调、GUI 事件到计算器 - 制作回调槽或接口 CalculatorConrollerInterface。
所以 - 您的计算器将实现 CalculatorConrollerInterface 以便能够从 GUI 接收事件。
使用dependency injection pattern 将您的Calculator 通过CalculatorConrollerInterface 注入您的GUI。
你的 GUI 应该实现(或者你可以使用 adapter pattern)CalculatorPresentationInterface 并且你应该通过 CalculatorPresentationInterface 将你的 GUI 注入到你真正的 Calculator 类中。
通过这种方式,业务逻辑层(计算器)和表示逻辑层(Qt GUI)将相互分离,您可以轻松地交换这两个层。
一个例子(每个类在单独的文件中)。
接口:
class CalculatorConrollerInterface
{
public:
virtual void onAdd() = 0;
virtual void onCurrentNumberChange(int number) = 0;
};
class CalculatorPresentationInterface
{
public:
virtual void showResult(int result) = 0;
};
计算器 - 与 Qt 没有任何联系:
class Calculator : public CalculatorConrollerInterface
{
public:
Calculator(CalculatorPresentationInterface& presentation)
: presentation(presentation)
{}
virtual void onAdd() override
{
// no idea this is correct - just example
previousNumber = previousNumber + currentNumber;
currentNumber = 0;
presentation.showResult(previousNumber );
}
void onCurrentNumberChange(int number) override
{
currentNumber = number;
}
private:
CalculatorPresentationInterface& presentation;
// all stuff necessary to calculate
int previousNumber;
int currentNumber;
};
Qt 计算器演示:
class QtCalculatorPresentation : public CalculatorPresentationInterface
{
public:
void setController(CalculatorConrollerInterface& controller)
{
this->controller = &controller;
}
void showResult(int result) override;
private:
CalculatorConrollerInterface* controller;
// plus all Qt widgets necessary
// and they shall forward any event to controller
};
还有你的主要:
#include "Calculator.hpp"
#include "QtCalculatorPresentation .hpp"
int main()
{
// dependency injections
QtCalculatorPresentation qtPresentation;
Calculator calculator(qtPresentation);
qtPresentation.setController(calculator);
qtPresentation.exec();
}
【讨论】:
std::function 或 boost::signal...