PySide6.QtWidgets.QDataWidgetMapper

class QDataWidgetMapper

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

PySide6.QtWidgets.QDataWidgetMapper 的继承图

概要

属性

方法

虚拟方法

插槽

信号

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

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

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

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

1

Qt 挪威

奥斯陆

2

Qt 澳大利亚

布里斯班

3

Qt 美国

帕洛阿尔托

4

Qt 中国

北京

5

Qt 德国

柏林

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

mapper = 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 支持两种提交策略,AutoSubmitManualSubmitAutoSubmit 会在当前小部件失去焦点时立即更新模型,而 ManualSubmit 则不会更新模型,除非调用 submit()ManualSubmit 在显示允许用户取消所有修改的对话框时非常有用。此外,其他显示模型的视图在用户完成所有修改并提交之前不会更新。

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

另请参阅

QAbstractItemDelegate

class SubmitPolicy

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

常量

描述

QDataWidgetMapper.AutoSubmit

每当小部件失去焦点时,小部件的当前值将被设置到项目模型中。

QDataWidgetMapper.ManualSubmit

在调用submit()之前,模型不会被更新。

注意

当使用from __feature__ import true_property时,属性可以直接使用,否则通过访问器函数使用。

property currentIndexᅟ: int

此属性保存当前行或列。

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

Access functions:
property orientationᅟ: Qt.Orientation

此属性保存模型的朝向。

如果方向是Qt::Horizontal(默认值),一个小部件将映射到数据模型的一列。该小部件将填充来自其映射列和currentIndex()指向的行的模型数据。

使用 Qt::Horizontal 用于看起来像这样的表格数据:

1

Qt 挪威

奥斯陆

2

Qt 澳大利亚

布里斯班

3

Qt 美国

硅谷

4

Qt 中国

北京

5

Qt 德国

柏林

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

使用 Qt::Vertical 来显示如下所示的表格数据:

1

2

3

4

5

Qt 挪威

Qt 澳大利亚

Qt 美国

Qt 中国

Qt 德国

奥斯陆

布里斯班

硅谷

北京

柏林

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

Access functions:
property submitPolicyᅟ: QDataWidgetMapper.SubmitPolicy

此属性保存当前的提交策略。

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

Access functions:
__init__([parent=None])
Parameters:

父对象QObject

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

addMapping(widget, section)
Parameters:
  • widgetQWidget

  • section – int

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

添加一个widget和模型中的一个section之间的映射。如果方向是水平的(默认),则section是模型中的一列,否则是一行。

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

mapper = QDataWidgetMapper()
mapper.setModel(myModel)
mapper.addMapping(nameLineEdit, 0)
mapper.addMapping(ageSpinBox, 1)

备注:

  • 如果 widget 已经映射到一个部分,旧的映射将被新的映射替换。

  • 只允许部分和小部件之间的一对一映射。不可能将单个部分映射到多个小部件,或将单个小部件映射到多个部分。

addMapping(widget, section, propertyName)
Parameters:

基本上与 addMapping() 相同,但增加了指定要使用的属性的可能性,通过指定 propertyName

另请参阅

addMapping()

clearMapping()

清除所有映射。

currentIndex()
Return type:

整数

另请参阅

setCurrentIndex()

属性 currentIndexᅟ 的获取器。

currentIndexChanged(index)
Parameters:

索引 – int

此信号在当前索引更改并且所有小部件都填充了新数据后发出。index 是新的当前索引。

属性 currentIndexᅟ 的通知信号。

itemDelegate()
Return type:

QAbstractItemDelegate

返回当前项目委托。

另请参阅

setItemDelegate()

mappedPropertyName(widget)
Parameters:

widgetQWidget

Return type:

QByteArray

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

mappedSection(widget)
Parameters:

widgetQWidget

Return type:

整数

返回widget映射到的部分,如果widget未映射则返回-1。

mappedWidgetAt(section)
Parameters:

部分 – int

Return type:

QWidget

返回映射在section处的小部件,如果该部分没有映射小部件,则返回0。

model()
Return type:

QAbstractItemModel

返回当前模型。

另请参阅

setModel()

orientation()
Return type:

方向

另请参阅

setOrientation()

属性 orientationᅟ 的获取器。

removeMapping(widget)
Parameters:

widgetQWidget

移除给定 widget 的映射。

revert()

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

rootIndex()
Return type:

QModelIndex

返回当前的根索引。

另请参阅

setRootIndex()

setCurrentIndex(index)
Parameters:

索引 – int

另请参阅

currentIndex()

属性 currentIndexᅟ 的设置器。

setCurrentModelIndex(index)
Parameters:

索引QModelIndex

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

内部调用 setCurrentIndex()。这个便捷槽可以连接到另一个视图的选择模型的信号 currentRowChanged() 或 currentColumnChanged()。

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

mapper = QDataWidgetMapper()
connect(myTableView.selectionModel(), QItemSelectionModel.currentRowChanged,
        mapper.setCurrentModelIndex)

另请参阅

currentIndex()

setItemDelegate(delegate)
Parameters:

delegateQAbstractItemDelegate

将项目委托设置为delegate。该委托将用于使用setEditorData()setModelData()将数据从模型写入小部件以及从小部件写入模型。

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

委托还决定何时应用数据以及何时更改编辑器,使用 commitData()closeEditor()

警告

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

另请参阅

itemDelegate()

setModel(model)
Parameters:

模型QAbstractItemModel

将当前模型设置为model。如果之前设置了另一个模型,所有与该旧模型的映射将被清除。

另请参阅

model()

setOrientation(aOrientation)
Parameters:

aOrientationOrientation

另请参阅

orientation()

属性 orientationᅟ 的设置器。

setRootIndex(index)
Parameters:

索引QModelIndex

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

另请参阅

rootIndex()

setSubmitPolicy(policy)
Parameters:

策略SubmitPolicy

另请参阅

submitPolicy()

属性 submitPolicyᅟ 的设置器。

submit()
Return type:

布尔

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

对于每个映射的部分,项目委托从小部件读取当前值并在模型中设置它。最后,调用模型的submit()方法。

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

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

submitPolicy()
Return type:

SubmitPolicy

另请参阅

setSubmitPolicy()

属性 submitPolicyᅟ 的获取器。

toFirst()

如果方向是水平的(默认),则使用模型的第一行数据填充小部件,否则使用第一列的数据。

这相当于调用 setCurrentIndex(0)

toLast()

如果方向是水平的(默认情况下),则使用模型最后一行的数据填充小部件,否则使用最后一列的数据。

内部调用 setCurrentIndex()

toNext()

如果方向是水平的(默认),则用模型下一行的数据填充小部件,否则用下一列的数据填充。

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

toPrevious()

如果方向是水平的(默认情况下),则使用模型前一行的数据填充小部件,否则使用前一列的数据。

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