天天看點

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) 

删除小部件的映射。