Qt避免循环依赖

时间:2017-05-20 09:41:17

标签: c++ qt callback circular-dependency

我有一个带有主类GUIApplication的Qt应用程序,它继承自QMainWindow,如下所示。 GUI有一个开始按钮,停止按钮和一个QGraphicsScene。

我的应用程序将从串口和其他内容读取数据,并根据收到的内容在QGraphicsScene上绘制。

我的主GUI类知道我的串口类,因为它必须在按下开始按钮等时初始化它。这很好。然而,我的串口类必须也必须能够与我的GUI类通信,因为它必须在接收数据和其他东西时更新QGraphicsScene。

我的问题是,对于我的串口类来说,了解GUI类也是一个糟糕的设计。这不是两类之间循环依赖的形式吗?我打算让我的串口类的成员成为GUI类的指针。这是唯一的方法吗,或者我应该在串口类中注册一个回调来解耦类?感谢任何帮助。

int[] data = { 0, 4, 2, 0, -1, 0, 4, 2, 0, 4, 0, 2 };
int max = Arrays.stream(data).max().getAsInt();
int[] indices = IntStream.range(0, data.length).filter(i -> data[i] == max).toArray();

O_O

// GUI class
#include "MySerial.h "
class GUIApplication : public QMainWindow
{
    Q_OBJECT

public:
//.........

1 个答案:

答案 0 :(得分:1)

这是一个糟糕的设计。您的串行端口类本质上与GUI无关,因此应该与它分离 - 除了循环依赖性之外,您使其灵活性降低并限制其可用性。有一天你可能想在控制台应用程序中使用它,如果你以必须知道GUI类的方式编写类,你必须修改它只是为了使它与控制台一起使用并且有两个版本虽然你不想在控制台应用程序中使用它,如果你不想破坏兼容性,这也只是在UI方面有所不同,后者没有太大意义,或者将Qt作为依赖项添加,这也没有多大意义。

更好的解决方案是在收到数据后从串口类或一些有意义的返回码发送一些信号,然后让GUI类捕获此值并更新QGraphicsScene本身。这样你也摆脱了循环依赖。