QDataWidgetMapper 类

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

头文件 #include <QDataWidgetMapper>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承自 QObject

公共类型

枚举SubmitPolicy { AutoSubmit, ManualSubmit }

属性

公共函数

QDataWidgetMapper(QObject *parent = nullptr)
virtual~QDataWidgetMapper()
voidaddMapping(QWidget *widget, int section)
voidaddMapping(QWidget *widget, int section, const QByteArray &propertyName)
voidclearMapping()
intcurrentIndex() const
QAbstractItemDelegate *itemDelegate() const
QByteArraymappedPropertyName(QWidget *widget) const
intmappedSection(QWidget *widget) const
QWidget *mappedWidgetAt(int section) const
QAbstractItemModel *model() const
Qt::Orientationorientation() const
voidremoveMapping(QWidget *widget)
QModelIndexrootIndex() const
voidsetItemDelegate(QAbstractItemDelegate *delegate)
voidsetModel(QAbstractItemModel *model)
voidsetOrientation(Qt::Orientation aOrientation)
voidsetRootIndex(const QModelIndex &index)
voidsetSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)
QDataWidgetMapper::SubmitPolicysubmitPolicy() const

公共槽

voidrevert()
virtual voidsetCurrentIndex(int index)
voidsetCurrentModelIndex(const QModelIndex &index)
bool提交()
void转到第一项()
void转到最后一项()
void转到下一项()
void转到上一项()

信号

voidcurrentIndexChanged(int index)

详细说明

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

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

可以设置项代理来支持自定义控件。默认情况下,使用 QStyledItemDelegate 来同步模型和控件。

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

1Qt 挪威奥斯陆
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 挪威,而 myCountryChooser 显示 奥斯陆。导航函数 toFirst()、toNext()、toPrevious()、toLast() 和 setCurrentIndex() 可以用来在模型中导航并使用模型的内容更新控件。

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

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

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

另请参阅QAbstractItemModelQAbstractItemDelegate

成员类型文档

枚举 QDataWidgetMapper::SubmitPolicy

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

常量描述
QDataWidgetMapper::AutoSubmit0每次控件失去焦点时,都将控件的当前值设置到项模型。
QDataWidgetMapper::ManualSubmit1模型将在调用 submit() 方法后更新。

属性文档

currentIndex : int

此属性表示当前行或列。

如果方向是水平方向(默认),则小部件将以索引处的行的数据填充。如果方向不是水平方向,则小部件将填充索引处的列的数据。

访问函数

intcurrentIndex() const
virtual voidsetCurrentIndex(int index)

通知信号

voidcurrentIndexChanged(int index)

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

orientation : Qt::Orientation

此属性表示模型的布局方向。

如果方向是 Qt::Horizontal(默认),则小部件将映射到数据模型的列。小部件将填充映射列和 currentIndex() 所指向的行中的模型数据。

使用 Qt::Horizontal 以填充类似以下格式的表格数据

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

如果方向设置为 Qt::Vertical,则小部件将映射到行。调用 setCurrentIndex() 将更改当前列。小部件将弹出映射行和 currentIndex() 所指向的列中的模型数据。

使用 Qt::Vertical 以填充类似以下格式的表格数据

12345
Qt 挪威Qt 澳大利亚Qt 美国Qt 中国Qt 德国
奥斯陆布里斯班硅谷北京柏林

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

访问函数

Qt::Orientationorientation() const
voidsetOrientation(Qt::Orientation aOrientation)

submitPolicy : SubmitPolicy

此属性表示当前的提交策略。

更改当前提交策略将所有小部件重置为从模型中当前数据。

访问函数

QDataWidgetMapper::SubmitPolicysubmitPolicy() const
voidsetSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)

成员函数文档

[显式] QDataWidgetMapper::QDataWidgetMapper(QObject *parent = nullptr)

以父对象 parent 构建一个新 QDataWidgetMapper。默认情况下,方向是水平,提交策略是 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);

注意

  • 如果 部件 已映射到某个部分,则旧映射将被新映射替换。
  • 允许部分和部件之间的一对一映射。不能将单个部分映射到多个部件,也不能将单个部件映射到多个部分。

另请参阅 removeMapping(),mappedSection() 和 clearMapping()。

void QDataWidgetMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)

本质上与 addMapping() 相同,但增加了指定 propertyName 的可能性。

另请参阅 addMapping()。

void QDataWidgetMapper::clearMapping()

清除所有映射。

另请参阅 addMapping() 和 removeMapping()。

[信号] 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 映射到的部分,如果部件未映射则返回 -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().

[槽] void QDataWidgetMapper::revert()

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

另请参阅submit() 和 setSubmitPolicy().

QModelIndex QDataWidgetMapper::rootIndex() const

返回当前根索引。

另请参阅setRootIndex().

[槽] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)

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

内部调用 setCurrentIndex()。这个便利槽可以连接到另一个视图的 选择模型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

© 2024 Qt公司有限公司。本文件中包含的文档贡献是各自拥有者的版权。提供的文档根据Free Software Foundation发布的版本1.3的GNU自由文档许可协议授权。Qt及其相关标志是Qt公司在芬兰和/或世界其他国家的商标。商标归Qt公司所有。所有其他商标均为各自所有者的财产。