- class QDataWidgetMapper#
类
QDataWidgetMapper
将数据模型的一部分与小部件之间进行映射。 更多信息…概要#
属性#
currentIndexᅟ
- 当前行或列orientationᅟ
- 模型的方向submitPolicyᅟ
- 当前提交策略
方法#
def
__init__()
def
addMapping()
def
clearMapping()
def
currentIndex()
def
itemDelegate()
def
mappedSection()
def
mappedWidgetAt()
def
model()
def
orientation()
def
removeMapping()
def
rootIndex()
def
setModel()
def
setOrientation()
def
setRootIndex()
def
submitPolicy()
虚函数#
槽函数#
信号#
注意
本文档可能包含自动从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德国
柏林
以下代码将映射模型列到名为
mySpinBox
、myLineEdit
和myCountryChooser
的小部件mapper = 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
会跟踪外部的修改。如果模型的内正在应用的另一个模块中更新,控件也会相应更新。- 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#
该属性存储当前的提交策略。
更改当前提交策略将使所有小部件恢复到模型中的当前数据。
使用父对象
parent
构造一个新的QDataWidgetMapper
。默认情况下,方向是水平且提交策略为AutoSubmit
。警告
本节包含自动从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)
- 参数::
widget –
QWidget
section – int
propertyName –
QByteArray
基本与
addMapping()
相同,但可以通过指定propertyName
来指定要使用的属性。参见
- clearMapping()#
清除所有映射。
- currentIndex()#
- 返回类型:
int
属性 currentIndex 的获取器。
- currentIndexChanged(index)#
- 参数::
index – int
当前索引更改后,会发出此信号,并且所有小部件都已填充新数据。
index
是新的当前索引。属性 currentIndex 的通知信号。
- itemDelegate()#
- 返回类型:
返回当前项代理。
返回用于将数据映射到给定
widget
的属性名称。返回
widget
映射到的部分,如果小部件未映射,则返回 -1。返回在
section
中映射的控件,如果没有在该部分进行映射,则返回 0。- model()#
- 返回类型:
返回当前模型。
参见
- orientation()#
- 返回类型:
属性
orientationᅟ
的获取器。删除给定
widget
的映射。- revert()#
重新填充所有控件的当前模型数据。所有未提交的更改都将丢失。
- rootIndex()#
- 返回类型:
返回当前根索引。
- setCurrentIndex(index)#
- 参数::
index – int
属性
currentIndexᅟ
的设置器。- setCurrentModelIndex(index)#
- 参数::
index – PySide6.QtCore.QModelIndex
警告
本节包含自动从C++转换到Python的代码片段,可能包含错误。
如果方向是水平(默认),则将当前索引设置为
index
的行,否则设置为index
的列。内部调用
setCurrentIndex()
。这个便利的槽函数可以连接到另一个视图选择模型中的 currentRowChanged() 或 currentColumnChanged() 信号。以下示例说明如何在名为
myTableView
的QTableView
的选择更改时更新所有小部件。mapper = QDataWidgetMapper() connect(myTableView.selectionModel(), QItemSelectionModel.currentRowChanged, mapper.setCurrentModelIndex)
- setItemDelegate(delegate)#
- 参数::
delegate –
QAbstractItemDelegate
将项代理设置为
delegate
。代理将用于将模型中的数据写入小部件以及从小部件写入模型,使用setEditorData()
和setModelData()
。将删除现有代理,但不会删除。
QDataWidgetMapper
不拥有delegate
。代理还决定何时应用数据和何时更改编辑器,使用
commitData()
和closeEditor()
。警告
你不应该在小部件映射器或视图中共享同一个代理的实例。这样做可能会导致编辑行为错误或非直观,因为每个连接到给定代理的视图都可能会收到
closeEditor()
信号,并尝试访问、修改或关闭已关闭的编辑器。- setModel(model)#
- 参数::
model –
QAbstractItemModel
将当前模型设置为
model
。如果设置了另一个模型,则清除到该旧模型的所有映射。参见
- setOrientation(aOrientation)#
- 参数::
aOrientation –
Orientation
属性
orientationᅟ
的设置器。- setRootIndex(index)#
- 参数::
index – PySide6.QtCore.QModelIndex
设置根项为
index
。这可以用来显示树的一部分。传递一个无效的模型索引以显示最顶层分支。参见
- setSubmitPolicy(policy)#
- 参数::
策略 –
SubmitPolicy
属性
submitPolicyᅟ
的设定器。- submit()#
- 返回类型:
bool
将映射的控件中所有更改提交给模型。
对于每个映射部分,项代理从控件中读取当前值并将其设置在模型中。最后,调用模型的 submit() 方法。
如果所有值都已提交,则返回
true
,否则为 false。注意:对于数据库模型,可以使用 QSqlQueryModel::lastError() 来检索最后一个错误。
- submitPolicy()#
- 返回类型:
属性
submitPolicyᅟ
的获取器。- toFirst()#
如果方向是水平(默认),则使用模型的第一行数据填充控件,否则使用第一列的数据。
这等价于调用
setCurrentIndex(0)
。- toLast()#
如果方向是水平(默认),则使用模型的最后一行数据填充控件,否则使用最后一列的数据。
内部调用
setCurrentIndex()
。参见
- toNext()#
如果方向为水平(默认),则使用模型下一条数据填充小部件,否则使用下方列的数据。
内部调用
setCurrentIndex()
。如果模型中没有下一条数据时不做任何操作。- toPrevious()#
如果方向为水平(默认),使用模型前一条数据填充小部件,否则使用上方列的数据。
内部调用
setCurrentIndex()
。如果模型中没有前一条数据时不做任何操作。