我有一个树状结构,表示通过串口连接到PC的设备系统。在某种程度上,这种结构是受Qt中的树模型示例的启发,我认为这有助于将逻辑部分从gui中分离出来。我的模型有一个根节点成员,可以通过根节点访问所有底层节点。一些节点应该自动完成它们的工作(即在定时器上向串口发送命令)。应用程序的常规任务是普通的:
每个节点都有指向根的指针,并且可以发出任何更改的信号。所以根节点是树的某种接口。现在,当移除子节点并通知模型时,我一直在与崩溃作斗争。事实上,我解决了这个问题,但是我认为这是设计上的问题。因此,我想问如何最好地实现我的数据结构和模型之间的交互。
一些问题是:数据结构应该能够对自身执行某些操作(添加或删除节点)并通知模型更改,还是应该由模型在树的适当请求下严格执行?
我使用Qt、信号和插槽,如果我的结构依赖于QAbstractItemModel机制--使用nodeIsAboutToBeRemoved / nodeRemoved这样的信号来准备相应的操作模型,会不会很糟糕?
更新一下我正在使用的结构。我并不坚持树是最好的,也不是我的紫色的理想结构。关于树有两种想法--它自然地代表了真实的系统,很容易使用Qt的模型和视图(树视图和表视图)。最后,树的想法被酋长和同事们接受了。我的树现在是5个层次:根-集线器(代表串口)-协调器设备-终端设备-传感器.稍后,可以在协调器设备和终端之间插入新的级别,并且可以重新实现集线器类,用于使用其他的东西而不是串口或使用另一种协议。现在没有多线程,也没有计划,但在我看来,多线程可以相对简单和自然地注入。每个集线器控制串行poort设置。每个级别的节点都知道所有子节点,因此它知道如何形成一组命令来调查物理设备。每个节点都可以保存它的状态(它是否可以在物理级别上访问),并将这个状态传递给子节点,或者仅仅控制他们的行为。
发布于 2017-07-14 15:08:22
这个树结构服务器有什么用途?
为什么不只是有链接的设备列表呢?
然后,您有一个通信中心类。每个设备都有一个对通信集线器的引用,该通信中心允许设备订阅自己选择的事件,并触发它们。
让每一个人在某种树上交谈听起来过于复杂和不必要。从数学上讲,它的效率要低得多。中央中心集线器模型的唯一缺点是,如果您使用多线程,可能会浪费很多周期来锁定集线器中的代码;然而,树模型也存在这个问题,即使它的程度稍小。
发布于 2018-03-12 08:10:52
在Qt的MV中,每个视图都显示一个模型。
通常,我通过使模型成为数据结构项的组合来实现这一点。然后,数据结构项继承QObject并使用信号/时隙机制发送通知。这有一个额外的好处,Qt的信号和插槽是线程安全的,如果您需要多线程的话。您可以向上传播更改并让根节点通知模型,或者将模型指针传递给不同的节点并直接通知它。
如果您有某种细节视图,那么您可能需要为每个项目建立一个模型。
所有这些听起来像是某种非持久的数据--除非是一个庞大的项目,否则我不会费心于将数据与模型实现分离开来。
在您的项目中,树的每个级别表示不同类型的对象,因此您可以用不同的类来表示它们。
数据本身是可以改变的,但是您需要正确地发出信号,否则就会发生崩溃。
https://softwareengineering.stackexchange.com/questions/352798
复制相似问题