QDataWidgetMapper Class

QDataWidgetMapper 类提供数据模型的一个部分与部件之间的映射。更多

Header: #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 可用于将数据感知部件映射到项目模型的部分,从而创建数据感知部件。如果方向是水平的(默认),则一个部分就是模型的一列,否则就是一行。

每次当前索引发生变化时,每个部件都会通过映射时指定的属性更新模型中的数据。如果用户编辑了 widget 的内容,则会使用相同的属性读取更改并写回模型。默认情况下,每个 widget 的user property 用于在模型和 widget 之间传输数据。自 Qt XML 4.3 起,一个附加的addMapping() 函数使命名的属性可用于替代默认的用户属性。

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

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

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

以下代码将把模型的列映射到名为mySpinBoxmyLineEditmyCountryChooser 的部件:

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

调用toFirst() 后,mySpinBox 显示值1myLineEdit 显示Qt NorwaymyCountryChooser 显示Oslo 。导航函数toFirst(),toNext(),toPrevious(),toLast() 和setCurrentIndex() 可用来在模型中导航,并用模型中的内容更新部件。

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

QDataWidgetMapper 支持两种提交策略:AutoSubmitManualSubmit 。一旦当前窗口小部件失去焦点,AutoSubmit 就会更新模型;除非调用submit() ,否则ManualSubmit 不会更新模型。ManualSubmit 在显示对话框让用户取消所有修改时非常有用。此外,在用户完成所有修改并提交之前,显示模型的其他视图也不会更新。

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

另请参阅 QAbstractItemModelQAbstractItemDelegate

成员类型文档

enum QDataWidgetMapper::SubmitPolicy

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

常量说明
QDataWidgetMapper::AutoSubmit0每当一个部件失去焦点时,该部件的当前值就会被设置为项目模型。
QDataWidgetMapper::ManualSubmit1直到调用submit() 时才会更新模型。

属性文档

currentIndex : int

该属性包含当前行或列

如果方向为水平(默认),则使用index 所在行的数据填充部件,否则使用index 所在列的数据填充部件。

访问功能:

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

Notifier 信号:

void currentIndexChanged(int index)

另请参阅 setCurrentModelIndex(),toFirst(),toNext(),toPrevious() 和toLast().

orientation : Qt::Orientation

该属性表示模型的方向

如果方向为Qt::Horizontal (默认值),则 widget 会映射到数据模型的一列。该 widget 将从其映射列和currentIndex() 指向的行中填充模型数据。

请使用Qt::Horizontal 来处理如下表格数据:

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

如果方向设置为Qt::Vertical ,部件将被映射到一行。调用setCurrentIndex() 将改变当前列。widget 将从其映射行和currentIndex() 指向的列中填充模型数据。

请使用Qt::Vertical 来处理类似下面这样的表格数据:

12345
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)

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

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

[virtual noexcept] QDataWidgetMapper::~QDataWidgetMapper()

销毁对象。

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

添加模型中widgetsection 之间的映射。如果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 映射到的部分,如果未映射到 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() 。

下面的示例说明了每当名为myTableViewQTableView 的选择发生变化时,如何用新数据更新所有部件:

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()。

© 2025 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.