本页内容

QDataWidgetMapper Class

QDataWidgetMapper 类提供了数据模型的某个部分与小部件之间的映射。更多内容...

头文件: #include <QDataWidgetMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QObject

公共类型

enum SubmitPolicy { AutoSubmit, ManualSubmit }

属性

公共函数

QDataWidgetMapper(QObject *parent = nullptr)
virtual ~QDataWidgetMapper()
void addMapping(QWidget *widget, int section)
void addMapping(QWidget *widget, int section, const QByteArray &propertyName)
void clearMapping()
int currentIndex() const
QAbstractItemDelegate *itemDelegate() const
QByteArray mappedPropertyName(QWidget *widget) const
int mappedSection(QWidget *widget) const
QWidget *mappedWidgetAt(int section) const
QAbstractItemModel *model() const
Qt::Orientation orientation() const
void removeMapping(QWidget *widget)
QModelIndex rootIndex() const
void setItemDelegate(QAbstractItemDelegate *delegate)
void setModel(QAbstractItemModel *model)
void setOrientation(Qt::Orientation aOrientation)
void setRootIndex(const QModelIndex &index)
void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)
QDataWidgetMapper::SubmitPolicy submitPolicy() const

公共槽位

void revert()
virtual void setCurrentIndex(int index)
void setCurrentModelIndex(const QModelIndex &index)
bool submit()
void toFirst()
void toLast()
void toNext()
void toPrevious()

信号

void currentIndexChanged(int index)

详细说明

QDataWidgetMapper 可通过将小部件映射到项目模型的各个部分来创建数据感知型小部件。如果方向为水平(默认),则一个部分对应模型中的一列;否则,则对应一行。

每当当前索引发生变化时,每个小部件都会通过映射时指定的属性,使用模型中的数据进行更新。如果用户编辑了小部件的内容,系统会使用相同的属性读取这些更改,并将其写回模型。 默认情况下,每个小部件的user property 用于在模型与小部件之间传输数据。自Qt 4.3起,新增的addMapping()函数允许使用命名属性代替默认的user属性。

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

假设我们有一个名为model 的项模型,其内容如下:

1Qt Norway奥斯陆
2Qt 澳大利亚布里斯班
3Qt 美国帕洛阿尔托
4Qt 中国北京
5Qt 德国柏林

以下代码将把模型的列映射到名为mySpinBox 、myLineEdit 和myCountryChooser 的控件上:

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

调用toFirst() 之后,mySpinBox 将显示1 的值,myLineEdit 将显示Qt Norway ,myCountryChooser 将显示Oslo 。可通过导航函数toFirst()、toNext()、toPrevious()、toLast() 和setCurrentIndex() 在模型中进行导航,并使用模型中的内容更新小部件。

setRootIndex() 函数允许将模型中的特定项指定为根索引——该项的子项将被映射到用户界面中的相关小部件。

QDataWidgetMapper 支持两种提交策略:AutoSubmit 和ManualSubmit 。AutoSubmit 会在当前控件失去焦点时立即更新模型;ManualSubmit 则不会更新模型,除非调用了submit()。ManualSubmit 在显示允许用户取消所有修改的对话框时非常有用。此外,显示该模型的其他视图也不会更新,直到用户完成所有修改并提交为止。

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

另请参阅 QAbstractItemModel 和QAbstractItemDelegate 。

成员类型文档

enum QDataWidgetMapper::SubmitPolicy

此枚举描述了QDataWidgetMapper 支持的可能提交策略。

常量值描述
QDataWidgetMapper::AutoSubmit0每当小部件失去焦点时,该小部件的当前值会被设置到项模型中。
QDataWidgetMapper::ManualSubmit1在调用submit() 之前,模型不会被更新。

属性文档

currentIndex : int

该属性保存当前行或列

如果方向为水平(默认),则小部件将填充来自index 行中的数据;否则,将填充来自index 列中的数据。

访问函数:

int currentIndex() const
virtual void setCurrentIndex(int index)

通知信号:

void currentIndexChanged(int index)

另请参阅 setCurrentModelIndex()、toFirst()、toNext()、toPrevious() 以及toLast()。

orientation : Qt::Orientation

该属性用于存储模型的取向

如果方向为“Qt::Horizontal ”(默认值),则会将一个控件映射到数据模型的某列。该控件将填充来自模型中已映射列的数据,以及由 `currentIndex()` 方法指向的那一行中的数据。

对于类似以下格式的表格数据,请使用Qt::Horizontal :

1Qt 挪威奥斯陆
2Qt 澳大利亚布里斯班
3Qt 美国硅谷
4Qt 中国北京
5Qt德国柏林

如果方向设置为Qt::Vertical ,则一个小部件将映射到一行。调用setCurrentIndex()将更改当前列。该小部件将填充来自其映射行以及currentIndex()所指向的列的模型数据。

对于类似以下格式的表格数据,请使用Qt::Vertical :

12345
Qt 挪威Qt 澳大利亚Qt 美国Qt 中国Qt 德国
奥斯陆布里斯班硅谷北京柏林

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

访问函数:

Qt::Orientation orientation() const
void setOrientation(Qt::Orientation aOrientation)

submitPolicy : SubmitPolicy

该属性存储当前的提交策略

更改当前提交策略将使所有小部件恢复为模型中的当前数据。

访问函数:

QDataWidgetMapper::SubmitPolicy submitPolicy() const
void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)

成员函数文档

[explicit] QDataWidgetMapper::QDataWidgetMapper(QObject *parent = nullptr)

创建一个以parent 为父对象的新QDataWidgetMapper。默认情况下,其方向为水平,提交策略为AutoSubmit 。

另请参阅 setOrientation() 和setSubmitPolicy()。

[virtual noexcept] QDataWidgetMapper::~QDataWidgetMapper()

销毁该对象。

void QDataWidgetMapper::addMapping(QWidget *widget, int section)

在模型中为“widget ”与“section ”之间建立映射关系。若方向为水平(默认),则“section ”在模型中为一列;否则为一行。

在下面的示例中,我们假设模型myModel 有两列:第一列包含一个小组中成员的姓名,第二列包含他们的年龄。第一列映射到QLineEdit 中的nameLineEdit ,第二列映射到QSpinBox 中的ageSpinBox :

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

注:

  • 如果widget 已被映射到某个部分,则旧的映射将被新的映射替换。
  • 仅允许部分与控件之间的一对一映射。无法将单个部分映射到多个控件,也无法将单个控件映射到多个部分。

另请参阅 removeMapping()、mappedSection() 和clearMapping()。

void QDataWidgetMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)

其功能与 addMapping() 基本相同,但增加了通过指定 `propertyName` 来指定要使用的属性的功能。

另请参阅 addMapping()。

void QDataWidgetMapper::clearMapping()

清除所有映射。

另请参阅 addMapping() 和removeMapping()。

[signal] void QDataWidgetMapper::currentIndexChanged(int index)

当当前索引发生变化且所有控件均已加载新数据后,将触发此信号。index 即为新的当前索引。

注意: 这是属性 `currentIndex`的通知器 信号。

另请参阅 currentIndex() 和setCurrentIndex()。

QAbstractItemDelegate *QDataWidgetMapper::itemDelegate() const

返回当前项的委托对象。

另请参阅 ` setItemDelegate()`。

QByteArray QDataWidgetMapper::mappedPropertyName(QWidget *widget) const

返回将数据映射到给定的widget 时所使用的属性名称。

另请参阅 mappedSection()、addMapping() 和removeMapping()。

int QDataWidgetMapper::mappedSection(QWidget *widget) const

返回widget 所映射的段落,如果该控件未被映射,则返回-1。

另请参阅 addMapping() 和removeMapping()。

QWidget *QDataWidgetMapper::mappedWidgetAt(int section) const

返回映射到section 的控件,如果该部分未映射任何控件,则返回0。

另请参阅 addMapping() 和removeMapping()。

QAbstractItemModel *QDataWidgetMapper::model() const

返回当前模型。

另请参阅 setModel()。

void QDataWidgetMapper::removeMapping(QWidget *widget)

删除给定widget 的映射。

另请参阅 addMapping() 和clearMapping()。

[slot] void QDataWidgetMapper::revert()

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

另请参阅 submit() 和setSubmitPolicy()。

QModelIndex QDataWidgetMapper::rootIndex() const

返回当前的根索引。

另请参阅 ` setRootIndex()`。

[slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)

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

内部调用setCurrentIndex()。此便捷槽可连接到另一个视图的selection model 的currentRowChanged()或currentColumnChanged()信号。

以下示例演示了如何在名为myTableView 的QTableView 选项发生变化时,更新所有小部件中的数据:

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

另请参阅 currentIndex()。

void QDataWidgetMapper::setItemDelegate(QAbstractItemDelegate *delegate)

将项的委托设置为delegate 。该委托将用于通过QAbstractItemDelegate::setEditorData() 和QAbstractItemDelegate::setModelData() 方法,将模型中的数据写入控件,并将控件中的数据写入模型。

任何现有的委托都将被移除,但不会被删除。QDataWidgetMapper 不会接管delegate 的所有权。

委托还会通过调用QAbstractItemDelegate::commitData() 和QAbstractItemDelegate::closeEditor() 来决定何时应用数据以及何时更换编辑器。

警告:不应在 控件映射器或视图之间共享同一个委托实例。这样做可能会导致编辑行为不正确或反直觉,因为连接到给定委托的每个视图都可能收到closeEditor() 信号,并试图访问、修改或关闭一个已经关闭的编辑器。

另请参阅 itemDelegate()。

void QDataWidgetMapper::setModel(QAbstractItemModel *model)

将当前模型设置为model 。如果之前设置了其他模型,则会清除所有指向该旧模型的映射。

另请参阅 model()。

void QDataWidgetMapper::setRootIndex(const QModelIndex &index)

将根项设置为index 。这可用于显示树的一个分支。传递一个无效的模型索引可显示最顶层的分支。

另请参阅 rootIndex()。

[slot] bool QDataWidgetMapper::submit()

将映射的小部件中的所有更改提交到模型。

对于每个已映射的区域,项委托会从控件中读取当前值,并将其设置到模型中。最后,调用模型的submit()方法。

如果所有值均已提交,则返回true ;否则返回false。

注意:对于数据库模型,QSqlQueryModel::lastError() 可用于检索最后一个错误。

另请参阅 ` revert()` 和 `setSubmitPolicy()`。

[slot] void QDataWidgetMapper::toFirst()

如果布局方向为水平(默认),则使用模型第一行中的数据填充控件;否则,使用模型第一列中的数据填充控件。

这相当于调用setCurrentIndex(0) 。

另请参阅 toLast() 和setCurrentIndex()。

[slot] void QDataWidgetMapper::toLast()

如果布局方向为水平(默认),则使用模型的最后一行数据填充控件;否则,使用模型的最后一列数据填充控件。

内部调用setCurrentIndex()。

另请参阅 toFirst() 和setCurrentIndex()。

[slot] void QDataWidgetMapper::toNext()

如果布局方向为水平(默认),则使用模型中下一行中的数据填充控件;否则,使用下一列中的数据填充控件。

内部调用setCurrentIndex()。如果模型中没有下一行,则不执行任何操作。

另请参阅 toPrevious() 和setCurrentIndex()。

[slot] void QDataWidgetMapper::toPrevious()

如果布局方向为水平(默认),则使用模型中上一行中的数据填充控件;否则,使用上一列中的数据填充控件。

内部调用setCurrentIndex()。如果模型中没有前一行,则不执行任何操作。

另请参阅 toNext() 和setCurrentIndex()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.