首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt中模型与自修改数据的交互作用

Qt中模型与自修改数据的交互作用
EN

Software Engineering用户
提问于 2017-07-14 13:46:52
回答 2查看 751关注 0票数 -1

我有一个树状结构,表示通过串口连接到PC的设备系统。在某种程度上,这种结构是受Qt中的树模型示例的启发,我认为这有助于将逻辑部分从gui中分离出来。我的模型有一个根节点成员,可以通过根节点访问所有底层节点。一些节点应该自动完成它们的工作(即在定时器上向串口发送命令)。应用程序的常规任务是普通的:

  1. 当节点的状态发生变化时通知模型。
  2. 通知模型当树的结构被修改时,一个节点添加了一个新的子节点或者删除了一个节点。

每个节点都有指向根的指针,并且可以发出任何更改的信号。所以根节点是树的某种接口。现在,当移除子节点并通知模型时,我一直在与崩溃作斗争。事实上,我解决了这个问题,但是我认为这是设计上的问题。因此,我想问如何最好地实现我的数据结构和模型之间的交互。

一些问题是:数据结构应该能够对自身执行某些操作(添加或删除节点)并通知模型更改,还是应该由模型在树的适当请求下严格执行?

我使用Qt、信号和插槽,如果我的结构依赖于QAbstractItemModel机制--使用nodeIsAboutToBeRemoved / nodeRemoved这样的信号来准备相应的操作模型,会不会很糟糕?

更新一下我正在使用的结构。我并不坚持树是最好的,也不是我的紫色的理想结构。关于树有两种想法--它自然地代表了真实的系统,很容易使用Qt的模型和视图(树视图和表视图)。最后,树的想法被酋长和同事们接受了。我的树现在是5个层次:根-集线器(代表串口)-协调器设备-终端设备-传感器.稍后,可以在协调器设备和终端之间插入新的级别,并且可以重新实现集线器类,用于使用其他的东西而不是串口或使用另一种协议。现在没有多线程,也没有计划,但在我看来,多线程可以相对简单和自然地注入。每个集线器控制串行poort设置。每个级别的节点都知道所有子节点,因此它知道如何形成一组命令来调查物理设备。每个节点都可以保存它的状态(它是否可以在物理级别上访问),并将这个状态传递给子节点,或者仅仅控制他们的行为。

EN

回答 2

Software Engineering用户

发布于 2017-07-14 15:08:22

这个树结构服务器有什么用途?

为什么不只是有链接的设备列表呢?

然后,您有一个通信中心类。每个设备都有一个对通信集线器的引用,该通信中心允许设备订阅自己选择的事件,并触发它们。

让每一个人在某种树上交谈听起来过于复杂和不必要。从数学上讲,它的效率要低得多。中央中心集线器模型的唯一缺点是,如果您使用多线程,可能会浪费很多周期来锁定集线器中的代码;然而,树模型也存在这个问题,即使它的程度稍小。

票数 0
EN

Software Engineering用户

发布于 2018-03-12 08:10:52

在Qt的MV中,每个视图都显示一个模型。

通常,我通过使模型成为数据结构项的组合来实现这一点。然后,数据结构项继承QObject并使用信号/时隙机制发送通知。这有一个额外的好处,Qt的信号和插槽是线程安全的,如果您需要多线程的话。您可以向上传播更改并让根节点通知模型,或者将模型指针传递给不同的节点并直接通知它。

如果您有某种细节视图,那么您可能需要为每个项目建立一个模型。

所有这些听起来像是某种非持久的数据--除非是一个庞大的项目,否则我不会费心于将数据与模型实现分离开来。

在您的项目中,树的每个级别表示不同类型的对象,因此您可以用不同的类来表示它们。

数据本身是可以改变的,但是您需要正确地发出信号,否则就会发生崩溃。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/352798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档