一、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)
删除小部件的映射。