StupidBeauty
Read times:1005Posted at:Sat Jan 18 00:53:22 2014
- no title specified

Wt 3.3.1文档翻译:Wt::WAbstractItemModel类参考,Wt::WAbstractItemModel Class Reference

抽象类

模型/视图系统

公有成员函数

bool

setHeaderData (int section, const boost::any &value)

设置某一列的表头数据。详细说明……

bool

setData (int row, int column, const boost::any &value, int role=EditRole, const WModelIndex &parent=WModelIndex())

设置指定行号和列号处的数据。详细说明……

virtual Signal< WModelIndex,
WModelIndex > &

dataChanged ()

当某个数据发生改变时会发射这个信号。详细说明……

virtual Signal &

modelReset ()

当模型被重置时,会发射这个信号。详细说明……

详细说明

这一个可与Wt 的视图(view)类配套使用的抽象模型。

这个抽象模型被Wt 的多个视图部件用作数据模型。

它可为树型和表格型视图部件提供数据模型服务。因此,数据是以一个由表格组成的层次结构来组织的,其中每个条目(item)都储存数据,并且列号为0的那些条目可作为嵌套的数据表格的亲代(parent)对象。每个数据条目都由它的行号、列号及亲代索引来唯一标识,并且可使用辅助类 WModelIndex 来引用各个条目。

每个条目都可以针对一个或多个角色来提供数据,并且可使用标志位来标识不同的选项。不同的角色可用于表达单个条目的不同方面的信息(它的文本值、图标、样式类),或者用于储存辅助性的自定义信息。标志位用于向视图(View)告之这个条目所支持的交互性功能的信息。

顶级的数据条目拥有一个无效的亲代WModelIndex

数据本身的类型是boost::any,它可以为空,也可以储存任意类型的数据。然而,取决于不同的角色,视图类可能预期访问到特定类型的数据(例如,对于Wt::StyleClassRole就预期访问到一个字符串)。

Wt的标准视图类可以显示(Wt::DisplayRole)以下数据:

视图类知道该怎么将这些类型的数据解释成一个字符串一个数字

在原生数据类型与boost::any之间的转换是这样进行的:

  • •.v (类型为Type)转换为boost::any a (用于setData()setHeaderData())

    boost::any a = boost::any(v);

    例如:

    WDate d(1976,6,14);

    model->setData(row, column, boost::any(d));

  • •.将boost::any a 转换为v (类型为Type) (用于data()headerData()):

    Type v = boost::any_cast<Type>(a);

    例如:

    WDate d = boost::any_cast<WDate>(model->data(row, column));

  • •.检查一个boost::any a变量中是否储存有一个值:

    if (!a.empty()) {

    ...

    }

  • •.确定一个boost::any a 变量的值类型,例如:

    if (a.type() == typeid(double)) {

    ...

    }

要实现一个自定义的模型的话,你需要重新实现(reimplement)以下方法:

  • •. index()parent()方法,用于在模型中遍历

  • •. columnCount()rowCount(),用于指定顶级的几何属性及每个条目的嵌套数据几何属性

  • •. data(),用于返回某个条目的数据

  • •.可选地,headerData(),用于返回某行或某列的表头数据

  • •.可选地,flags(),用于指示数据选项

在实现一个层次型模型的过程中的一个关键点就是,要决定好,怎么以一个内部指针(WModelIndex::internalPointer())或内部编号(WModelIndex::internalId())的角度来引用一个索引。顶级索引除外,它是特殊的,因为它是以一个无效的索引来引用的,其它的每个带有子代数据条目的索引,都必须能够使用这个数字或指针来唯一地标识。例如,在WStandardItemModel中,内部指针指向亲代WStandardItem。对于表格型模型,内部指针不起作用,因为只有顶级索引拥有子代条目。

如果妳想要支持该模型的编辑功能,那么,妳需要使用一个Wt::ItemIsEditable标志位来宣称这种支持,并且重写setData()。视图类会使用EditRole来为编辑器读取及更新数据。

当模型的数据发生改变时,模型必须发射dataChanged()信号。

最后,还有一个通用接口,用于插入新数据或删除数据(改变几何属性),不过这个接口不会被任何视图类使用:

或者,妳也可以提供自己的一套用于改变模型的接口。无论妳采用哪种方式来实现,有一点都非常重要,那就是,妳要调用对应的受保护的(protected)成员函数,它们会发射相关的信号,这样,视图对象就可以将自身适配到新的几何属性上去。

成员函数文档

virtual Signal<WModelIndex, WModelIndex>& Wt::WAbstractItemModel::dataChanged

(

)

virtual

当某个数据发生改变时会发射这个信号。

两个参数分别是,包含了所有已改变的数据条目的矩形区域的左上角及右下角数据条目的模型索引。

参考

setData()

virtual Signal& Wt::WAbstractItemModel::modelReset

(

)

virtual

当模型被重置时会发射这个信号。

模型的重置动作会将所有已有的数据标记为无效,并且该模型有可能会改变它的整个几何属性(列数、行数)。

参考

reset()

bool Wt::WAbstractItemModel::setData

(

int

row,

int

column,

const boost::any &

value,

int

role = EditRole ,

const WModelIndex &

parent = WModelIndex ()

)

设置指定行号和列号处的数据。

这是一个便利方法,等价于:

setData(index(row, column, parent), value, role);

如果操作成功则返回真(true)。

参考

setData()index()

bool Wt::WAbstractItemModel::setHeaderData

(

int

section,

const boost::any &

value

)

设置某一列的表头数据。

如果操作成功则返回真(true)。

参考

setHeaderData(int, Orientation, const boost::any&, int)

孙燕姿

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands