Qt模型视图框架:QDataWidgetMapper

一、描述

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

每次当前索引发生变化时,每个小部件都会通过映射时指定的属性使用来自模型的数据进行更新。 如果用户编辑小部件的内容,则会使用相同的属性读取更改并将其写回模型。默认情况下,每个小部件的用户属性用于在模型和小部件之间传输数据。

可以设置项目委托以支持自定义小部件。 默认情况下,使用 QItemDelegate 将模型与小部件同步。

例:以下代码将模型的列映射到小部件:

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

QDataWidgetMapper 支持两种提交策略(enum QDataWidgetMapper::SubmitPolicy):

  • AutoSubmit:将在当前小部件失去焦点后立即更新模型。
  • ManualSubmit:除非调用 submit(),否则不会更新模型。

此外,在用户完成所有修改并提交之前,显示模型的其他视图不会更新。

QDataWidgetMapper 会跟踪外部修改。如果模型的内容在应用程序的另一个模块中更新,则小部件也会更新。

二、属性成员

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,java,c++)