Qt模型视图框架:QDataWidgetMapper

一、描述

QDataWidgetMapper 可用于将模型数据映射到小部件。

每次当前索引发生变化时,每个小部件都会通过映射时指定的属性使用来自模型的数据进行更新。 如果用户编辑小部件的内容,则会使用相同的属性读取更改并将其写回模型。默认情况下,每个小部件的用户属性用于在模型和小部件之间传输数据。

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

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

    QDataWidgetMapper *mapper = new QDataWidgetMapper;
    mapper->setModel(model);
    mapper->addMapping(mySpinBox, 0);
    mapper->addMapping(myLineEdit, 1);
    mapper->addMapping(myCountryChooser, 2);
    mapper->toFirst();

QDataWidgetMapper 支持两种提交策略(enum QDataWidgetMapper::SubmitPolicy):

  • AutoSubmit:将在当前小部件失去焦点后立即更新模型。
  • ManualSubmit:除非调用 submit(),否则不会更新模型。

此外,在用户完成所有修改并提交之前,显示模型的其他视图不会更新。

QDataWidgetMapper 会跟踪外部修改。如果模型的内容在应用程序的另一个模块中更新,则小部件也会更新。

二、属性成员

1、currentIndex : int

此属性保存当前行或列。

如果方向是水平的(默认),小部件将使用来自索引行的数据填充,否则使用来自索引列的数据。

2、orientation : Qt::Orientation

此属性保存模型的方向。

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

三、成员函数

1、[信号] void currentIndexChanged(int index)

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

2、void revert()

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

3、void setCurrentModelIndex(const QModelIndex &index)

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

视图的选择发生更改时使用新数据更新所有小部件:

 QDataWidgetMapper *mapper = new QDataWidgetMapper;
 connect(myTableView->selectionModel(), &QItemSelectionModel::currentRowChanged,mapper, &QDataWidgetMapper::setCurrentModelIndex);

4、bool submit()

将所有更改从映射的小部件提交到模型。如果所有值都已提交,则返回 true。

5、void toFirst()

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

6、void toLast()

如果方向为水平,则使用模型最后一行的数据填充小部件,否则使用最后一列的数据。

7、void toNext()

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

8、void toPrevious()

如果方向是水平的,则使用模型前一行的数据填充小部件,否则使用上一列的数据。

9、void addMapping(QWidget *widget, int section)

添加小部件和模型部分之间的映射。 如果方向是水平的(默认),则截面是模型中的一列,否则是一行。

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

     QDataWidgetMapper *mapper = new QDataWidgetMapper;
     mapper->setModel(myModel);
     mapper->addMapping(nameLineEdit, 0);
     mapper->addMapping(ageSpinBox, 1);

如果小部件已映射到某个部分,则旧映射将被新映射替换。

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

10、void clearMapping()

清除所有映射。

11、int mappedSection(QWidget *widget)  / QWidget *mappedWidgetAt(int section)

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

12、void removeMapping(QWidget *widget) 

删除小部件的映射。

QDataWidgetMapper 是一个非常方便的工具,可以用来将数据库中的数据映射到Qt中的控件上,也可以将Qt中的控件上的数据提交到数据库中。 下面是一个简单的示例,演示如何使用QDataWidgetMapper来查询和提交数据。 首先,需要在Qt中连接到MySQL数据库。可以使用Qt提供的QSqlDatabase类来实现。以下是一个简单的连接示例: ```c++ QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("mydatabase"); db.setUserName("myusername"); db.setPassword("mypassword"); if (!db.open()) { qDebug() << "Failed to connect to database"; } ``` 接下来,需要创建一个QSqlTableModel对象,用于从数据库中检索数据: ```c++ QSqlTableModel *model = new QSqlTableModel(this, db); model->setTable("mytable"); model->select(); ``` 现在,可以将QSqlTableModel对象中的数据映射到Qt中的控件上。为此,需要创建一个QDataWidgetMapper对象,并将其与控件和模型对象关联: ```c++ QDataWidgetMapper *mapper = new QDataWidgetMapper(this); mapper->setModel(model); mapper->addMapping(ui->lineEditName, 1); // Map column 1 to line edit mapper->addMapping(ui->lineEditAge, 2); // Map column 2 to line edit mapper->toFirst(); // Map data from the first row ``` 现在,可以使用QDataWidgetMapper对象查询和显示数据。以下是一个简单的查询示例: ```c++ mapper->toFirst(); // Move to the first row while (mapper->currentIndex() != -1) { QString name = mapper->mappedWidgetAt(0)->property("text").toString(); int age = mapper->mappedWidgetAt(1)->property("text").toInt(); qDebug() << name << age; mapper->toNext(); // Move to the next row } ``` 要提交数据,只需在QDataWidgetMapper对象上调用submit()方法即可: ```c++ mapper->submit(); ``` 如果需要撤消所有未提交的更改,可以使用revert()方法: ```c++ mapper->revert(); ``` 希望这个示例对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值