关闭

QT笔记:数据库总结(五)之SQL模型类-QDataWidgetMapper类

发表于:2013-7-10 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:vloong    来源:51Testing软件测试网采编

  QDataWidgetMapper将一个数据库记录字段反映到其映射的窗口部件中,同时将窗口部件中所做出的更改反映回数据库,关键是关联一个model和一组widget

  一、步骤

  1、创建 QDataWidgetMapper 对象

  2、关联 model

  3、关联 widgets,并创建其与model中section的映射

  4、定位到某个record

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

  提交方式可以设为手动:

mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);

  QComboBox组件的mapper比较特殊

  第一种、在关系模型中实现mapper到QComboBox组件

QSqlRelationalTableModel *model = QSqlRelationalTableModel(this);

model->setTable("员工表");
model->setRelation(dep_id,QSqlRelation("部门表","id","name"));
 // ... 其它代码

//QComboBox与QListWidget很相拟,因为它有一个内部模型去保存它的数据条目,所以我们用自己建的模型代替那个自带的模型。给出QSqlRelationalTableModel使用的关系模型,这个模型有两列,必须指出组合框应该显示哪一列
QSqlTableModel *relationModel = model->relationModel(dep_id); // 部门ID
comboBox->setMode(relationModel);
comboBox->setModelColumn(relationModel->fieldIndex("name")); // 使用字段名得到正确的标题索引,以使组合框显示部门名

  第二种、使用代理的方式

  1、实现自定义代理类,实现setEditorData()和setModelData()

  2、给模型添加我们自己的代理类对象

MapDelegate *delegate = new MapDelegate(this); // 生成自定义的代理类对象
mapper->setItemDelegate(delegate); // 给模型添加我们自己的代理类

void MapDelegate::setEditorData(QWidget *editor, const QModelIndex& index) const{
    if(index.column() == 0) // 假如模型的第0列为公司名 
    {
        QComboBox *comboEditor = qobject_cast<QComboBox *>(editor);
        if (comboEditor)
        {
            int i = comboEditor->findText(index.model()->data(index, Qt::EditRole).toString()); // 在comboBox组件中查找model中的当前公司名
    comboEditor->setCurrentIndex(i); // 设成model中的当前公司名
        }  
    }
    else
    {
        return QItemDelegate::setEditorData(editor, index);
    }
}

void MapDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const
{
    if(index.column() == 0)
    {
        QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
        if(comboBox)
        {
            model->setData(index, comboBox->currentText());
        }
    }
    else
    {
        return QItemDelegate::setModelData(editor, model, index);
    }
}

相关文章

QT笔记:数据库总结(一)

QT笔记:数据库总结(二)之SQL模型类-QSqlQueryModel模型

QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型

QT笔记:数据库总结(四)之SQL模型类-QSqlRelationalTableModel模型

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号