LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
QT笔记:数据库总结(五)之SQL模型类-QDataWidget
2017-02-13

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);

    }

}




推荐文章
评论(0)
联系我们|招贤纳士|移动客户端|风格模板|官方博客|侵权投诉 Reporting Infringements|未成年人有害信息举报 0571-89852053|涉企举报专区
网易公司版权所有 ©1997-2024  浙公网安备 33010802010186号 浙ICP备16011220号-11 增值电信业务经营许可证:浙B2-20160599
网络文化经营许可证: 浙网文[2022]1208-054号 自营经营者信息 工业和信息化部备案管理系统网站 12318全国文化市场举报网站
网信算备330108093980202220015号 网信算备330108093980204230011号
分享到
转载我的主页