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 } |
属性
- currentIndex : int
- orientation : Qt::Orientation
- submitPolicy : SubmitPolicy
公共功能
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 | 挪威 | 奥斯陆 |
2 | Qt 澳大利亚 | 布里斯班 |
3 | Qt 美国 | 帕洛阿尔托 |
4 | Qt 中国 | 北京 |
5 | Qt 德国 | 柏林 |
以下代码将把模型的列映射到名为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
就会更新模型;除非调用submit() ,否则ManualSubmit
不会更新模型。ManualSubmit
在显示对话框让用户取消所有修改时非常有用。此外,在用户完成所有修改并提交之前,显示模型的其他视图也不会更新。
请注意,QDataWidgetMapper 会跟踪外部修改。如果模型内容在应用程序的其他模块中更新,部件也会随之更新。
另请参阅 QAbstractItemModel 和QAbstractItemDelegate 。
成员类型文档
enum QDataWidgetMapper::SubmitPolicy
该枚举描述了QDataWidgetMapper 可能支持的提交策略。
常量 | 值 | 说明 |
---|---|---|
QDataWidgetMapper::AutoSubmit | 0 | 每当一个部件失去焦点时,该部件的当前值就会被设置为项目模型。 |
QDataWidgetMapper::ManualSubmit | 1 | 直到调用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 | 挪威 | 奥斯陆 |
2 | Qt 澳大利亚 | 布里斯班 |
3 | Qt 美国 | 硅谷 |
4 | Qt 中国 | 北京 |
5 | Qt 德国 | 柏林 |
如果方向设置为Qt::Vertical ,部件将被映射到一行。调用setCurrentIndex() 将改变当前列。widget 将从其映射行和currentIndex() 指向的列中填充模型数据。
请使用Qt::Vertical 来处理类似下面这样的表格数据:
1 | 2 | 3 | 4 | 5 |
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)
添加模型中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 映射到的部分,如果未映射到 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()。
© 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.