【问题标题】:Communication between models模型之间的通信
【发布时间】:2015-06-23 15:45:36
【问题描述】:

我的程序以原始格式从文件中加载记录(每行一个)。

我有一些视图可以以不同的方式显示这些数据:

  • 字节视图
  • 十进制视图(通过对字节范围进行一些计算)

两个视图都必须提供编辑值的能力。

这是一些代码:

class Record
{
public:
  void setByte (int position, Byte byte);
  void setValue (ValueType type, Value value);

  Byte getByte (int position) const;
  Value getValue (ValueType type) const;

private:
  RawData data;
}

我正在加载记录

QVector<Record> records;

字节视图是一个带有十六进制字节的简单表格(行 - 行号,列 - 字节位置)。十进制视图也是一个表格(行 - 行号,一列 - 值)。

那么,为我的视图设计具有相互通信能力的模型(例如,当从其中一个视图修改数据时发送信号)的最佳方法是什么?

【问题讨论】:

    标签: qt oop design-patterns model-view-controller model


    【解决方案1】:

    当您使用 Qt 时,通常最好对 Qt 自己的模型之一进行子类化。这样,您将免费获得许多视图小部件,同时通过遵循与您使用的其他工具包相同的标准,使您的代码更加一致。 Qt's documentation 有一些指导方针,说明您必须实施哪些方法/信号/槽。

    需要查看的一些类:QAbstractItemModelQAbstractTableModelQAbstractListModel

    对于视图方面,您应该更喜欢使用 Qt 提供的小部件,如有必要,请实现 delegate 以更改其外观。

    在您的具体情况下,我会将 QAbstractTableModel 子类化,并将您的记录包装在此类中。

    【讨论】:

    • 感谢您的回答,但我需要更通用的解决方案,例如 UML 草图(我的意思是类图)或类似的东西。
    • @SandyEmerald 请更新您的问题以反映您的真正意图。您提出的记录甚至不如 Qt 的模型通用。您可以很容易地在 Qt 模型中表示一棵记录表树。到目前为止,我不明白为什么您需要“更通用”的解决方案。你的数据结构不能用树来表示吗?
    • @KubaOber 问题的想法是当我在我的任何视图中编辑某些值时,如何设计我的模型以相互通信?我的意思是我有一个数据源(我的记录向量)和不同的数据更改方式(通过编辑十六进制或十进制值)。那么我的模型应该是什么?
    • 我的回答涵盖了你所说的一切。如果您将 Qt 视图与委托组合在一起,您可以以任何您需要的方式显示/编辑来自 Qt 模型的数据
    • @sandyEmerald 子类 QAbstractItemModel 或者,更简单的是 QAbstractListModelQAbstractTableModel。见the documentation。然后实现您的视图,以便它们对模型的信号做出适当的反应,或重用现有视图,例如 QTreeView 等。
    猜你喜欢
    • 2012-06-28
    • 2016-09-11
    • 2012-06-02
    • 2015-02-11
    • 2014-09-10
    • 2020-01-09
    • 1970-01-01
    • 2011-09-06
    • 2012-04-27
    相关资源
    最近更新 更多