class QDataWidgetMapper#

QDataWidgetMapper 将数据模型的一部分与小部件之间进行映射。 更多信息

Inheritance diagram of 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 Norway,而myCountryChooser则显示的是Oslo。导航函数toFirst()toNext()toPrevious()toLast()setCurrentIndex()可以用来在模型中导航并更新带有模型内容的控件。

setRootIndex()函数允许指定模型中的某个项作为根索引 - 此项的子项将被映射到用户界面中的相关控件。

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

请注意,QDataWidgetMapper会跟踪外部的修改。如果模型的内正在应用的另一个模块中更新,控件也会相应更新。

class SubmitPolicy#

这个枚举描述了QDataWidgetMapper支持的提交策略。

常量

描述

QDataWidgetMapper.AutoSubmit

每次控件失去焦点时,都会将控件当前值设置为项模型。

QDataWidgetMapper.ManualSubmit

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

注意

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

属性currentIndex: int#

该属性存储当前的行或列。

如果方向是水平的(默认),则小部件用位于index行的数据填充,否则用位于index列的数据填充。

访问函数
属性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德国

奥斯陆

布里斯班

硅谷

北京

柏林

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

访问函数
属性submitPolicy: QDataWidgetMapper.SubmitPolicy#

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

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

访问函数
__init__([parent=None])#
参数::

parentQObject

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

addMapping(widget, section)#
参数::
  • 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)
参数::

基本与 addMapping() 相同,但可以通过指定 propertyName 来指定要使用的属性。

参见

addMapping()

clearMapping()#

清除所有映射。

currentIndex()#
返回类型:

int

属性 currentIndex 的获取器。

currentIndexChanged(index)#
参数::

index – int

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

属性 currentIndex 的通知信号。

itemDelegate()#
返回类型:

QAbstractItemDelegate

返回当前项代理。

mappedPropertyName(widget)#
参数::

widgetQWidget

返回类型:

QByteArray

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

mappedSection(widget)#
参数::

widgetQWidget

返回类型:

int

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

mappedWidgetAt(section)#
参数::

section – int

返回类型:

QWidget

返回在 section 中映射的控件,如果没有在该部分进行映射,则返回 0。

model()#
返回类型:

QAbstractItemModel

返回当前模型。

参见

setModel()

orientation()#
返回类型:

Orientation

属性 orientationᅟ 的获取器。

removeMapping(widget)#
参数::

widgetQWidget

删除给定 widget 的映射。

revert()#

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

rootIndex()#
返回类型:

QModelIndex

返回当前根索引。

setCurrentIndex(index)#
参数::

index – int

属性 currentIndexᅟ 的设置器。

setCurrentModelIndex(index)#
参数::

indexPySide6.QtCore.QModelIndex

警告

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

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

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

以下示例说明如何在名为 myTableViewQTableView 的选择更改时更新所有小部件。

mapper = QDataWidgetMapper()
connect(myTableView.selectionModel(), QItemSelectionModel.currentRowChanged,
        mapper.setCurrentModelIndex)
setItemDelegate(delegate)#
参数::

delegateQAbstractItemDelegate

将项代理设置为 delegate。代理将用于将模型中的数据写入小部件以及从小部件写入模型,使用 setEditorData()setModelData()

将删除现有代理,但不会删除。 QDataWidgetMapper 不拥有 delegate

代理还决定何时应用数据和何时更改编辑器,使用 commitData()closeEditor()

警告

你不应该在小部件映射器或视图中共享同一个代理的实例。这样做可能会导致编辑行为错误或非直观,因为每个连接到给定代理的视图都可能会收到 closeEditor() 信号,并尝试访问、修改或关闭已关闭的编辑器。

setModel(model)#
参数::

modelQAbstractItemModel

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

参见

model()

setOrientation(aOrientation)#
参数::

aOrientationOrientation

参见

orientation()

属性 orientationᅟ 的设置器。

setRootIndex(index)#
参数::

indexPySide6.QtCore.QModelIndex

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

参见

rootIndex()

setSubmitPolicy(policy)#
参数::

策略SubmitPolicy

属性 submitPolicyᅟ 的设定器。

submit()#
返回类型:

bool

将映射的控件中所有更改提交给模型。

对于每个映射部分,项代理从控件中读取当前值并将其设置在模型中。最后,调用模型的 submit() 方法。

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

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

submitPolicy()#
返回类型:

SubmitPolicy

属性 submitPolicyᅟ 的获取器。

toFirst()#

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

这等价于调用 setCurrentIndex(0)

toLast()#

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

内部调用 setCurrentIndex()

参见

请参考 toFirst() setCurrentIndex()

toNext()#

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

内部调用 setCurrentIndex()。如果模型中没有下一条数据时不做任何操作。

toPrevious()#

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

内部调用 setCurrentIndex()。如果模型中没有前一条数据时不做任何操作。