Qt模型视图框架:QDataWidgetMapper 数据映射

一、QDataWidgetMapper 可用于将模型数据映射到小部件。

QDataWidgetMapper映射

例1:界面组件(参数1) 与 tabModel数据模型的具体字段(参数2) 之间的联系;

dataMapper->addMapping(ui->dbSpinEmpNo, tabModel->fieldIndex("empNo"));

例2:将模型的列,映射到小部件

QDataWidgetMapper *mapper = new QDataWidgetMapper;
mapper->setModel(model);
mapper->addMapping(mySpinBox, 0);
mapper->addMapping(myLineEdit, 1);
mapper->addMapping(myCountryChooser, 2);
mapper->toFirst();

通过将QDataWidgetMapper映射到项目模型的各个部分,QDataWidgetMapper可用于创建数据感知小部件。 如果方向是水平的(默认),则区域是模型的一列,否则是一行。

每当当前索引发生变化时,每个小部件都会通过映射时指定的属性使用模型中的数据进行更新。 如果用户编辑小部件的内容,则使用相同的属性读取更改并写回模型。 默认情况下,每个小部件的用户属性用于在模型和小部件之间传输数据。 从Qt 4.3开始,一个额外的addMapping()函数可以使用命名属性来代替默认的用户属性。

QDataWidgetMapper支持两个提交策略,AutoSubmit和ManualSubmit。 AutoSubmit会在当前窗口小部件失去焦点后立即更新模型,除非调用submit(),否则ManualSubmit不会更新模型。 当显示允许用户取消所有修改的对话框时,ManualSubmit非常有用。 此外,显示模型的其他视图在用户完成所有修改和提交之后才会更新。

内容

描述

QDataWidgetMapper::AutoSubmit

0

每当小部件失去焦点时,小部件的当前值将设置为项目模型。

QDataWidgetMapper::ManualSubmit

1

在调用submit()之前,模型不会更新。

二、属性成员

1、currentIndex : int

此属性保存当前行或列。

如果方向是水平的(默认),小部件将使用来自索引行的数据填充,否则使用来自索引列的数据。

2、orientation : Qt::Orientation

此属性保存模型的方向。

更改方向会清除所有现有映射。

三、成员函数

1、[信号] void currentIndexChanged(int index)

在当前索引更改并且所有小部件都填充有新数据后发出此信号。

2、void revert()

使用模型的当前数据重新填充所有小部件。所有未提交的更改都将丢失。

3、void setCurrentModelIndex(const QModelIndex &index)

如果方向为水平(默认),则将当前索引设置为索引的行,否则设置为索引的列。

视图的选择发生更改时使用新数据更新所有小部件:

 QDataWidgetMapper *mapper = new QDataWidgetMapper;
 connect(myTableView->selectionModel(), &QItemSelectionModel::currentRowChanged,mapper, &QDataWidgetMapper::setCurrentModelIndex);

4、bool submit()

将所有更改从映射的小部件提交到模型。如果所有值都已提交,则返回 true。

5、void toFirst()

如果方向为水平,则使用模型第一行的数据填充小部件,否则使用第一列的数据。

6、void toLast()

如果方向为水平,则使用模型最后一行的数据填充小部件,否则使用最后一列的数据。

7、void toNext()

如果方向是水平的,则使用模型下一行的数据填充小部件,否则使用下一列的数据。

8、void toPrevious()

如果方向是水平的,则使用模型前一行的数据填充小部件,否则使用上一列的数据。

9、void addMapping(QWidget *widget, int section)

添加小部件和模型部分之间的映射。 如果方向是水平的(默认),则截面是模型中的一列,否则是一行。

对于以下示例,假设模型 myModel 有两列:第一列包含组中人员的姓名,第二列包含他们的年龄。 第一列映射到 QLineEdit nameLineEdit,第二列映射到 QSpinBox ageSpinBox:

     QDataWidgetMapper *mapper = new QDataWidgetMapper;
     mapper->setModel(myModel);
     mapper->addMapping(nameLineEdit, 0);
     mapper->addMapping(ageSpinBox, 1);

如果小部件已映射到某个部分,则旧映射将被新映射替换。

只允许部分和小部件之间的一对一映射。 不可能将单个部分映射到多个小部件,或将单个小部件映射到多个部分。

10、void clearMapping()

清除所有映射。

11、int mappedSection(QWidget *widget)  / QWidget *mappedWidgetAt(int section)

返回小部件映射到的部分,如果小部件未映射,则返回 -1。/ 返回映射的小部件。

12、void removeMapping(QWidget *widget) 

删除小部件的映射。

你可能感兴趣的:(QT,qt)