Qt-自定义[模型、视图、代理模型、委托]的Demo

一 简介

1. 自定义[模型、视图、代理模型、委托]的使用方法

1.1 根据你的需求选择合适的Qt内置[模型、视图、代理模型、委托]

1.2 创建自定义类,继承Qt内置[模型、视图、代理模型、委托],并重写它们的虚函数,实现功能

2. Qt内置[模型、视图、代理模型、委托]类有很多,不可能在这里全部列举出来。但是它们的原理都是一样的,只要掌握其中一种,其他的自然而然就掌握了,等你真正需要的时候再去查帮助文档就行了。

3. 本章给大家列举一个使用自定义[模型、视图、代理模型、委托]创建表格控件的Demo,完整的代码在绑定的资源中,审核通过后大家可以免费下载。

二 表格控件功能展示

1. 程序有Windows版和Linux版

2. 可以读取Sqlite数据库表格中的数据,展示到视图上,在视图上修改数据后会自动更新到Sqlite数据库中

3. 可以对数据按行筛选和按列排序

4. 可以自定义视图表头

5. 可以在表头和视图上显示富文本、图标

6. 可以自定义编辑控件来修改数据

7. 可以删除行和插入行并更新到Sqlite数据库表格中

8. 可以对数据进行修改(例如:加密)后展示到视图上,也可以将解密后的数据更新到Sqlite数据库表格中

9. 可以定制视图样式

10. 有右键菜单功能

11. 表格控件封装成了动态库,提供了设置接口

12. 错误检测机制:若在视图中录入的数据违反数据库表格的约束规则,则弹窗提示错误,并恢复数据

三代码示例

实现方法请参考代码注释,代码注释很详细,就不在这里赘述了。

//设置数据库文件信息
void GridControl::setDbFileInfo(QString strDbFilePath, QString strDbType, QString strConnectName, QString strUserName, QString strPassword)
{
    m_pSqliteDb->setConnectInfo(strDbFilePath, strDbType, strConnectName, strUserName, strPassword);
}
//设置要展示的数据表格名称、字段和字段对应的标题名称
void GridControl::setShowTableField(QString strTableName, std::map<QString, QString> mapShowFieldName)
{
    m_pMymodel->setShowFieldNameData(strTableName, mapShowFieldName);
}
//设置单元项的编辑框样式(列)
void GridControl::setCellEdit(std::map<QString, QStringList> mapCellEdit)
{
    m_pDelegate->setCellEdit(mapCellEdit);
}
//设置标题对应的富文本
void GridControl::setRichText(std::map<QString, QString> mapRichText)
{
    m_pHeadrView->setRichText(mapRichText);
}
    //初始化数据

    //要在视图中显示的数据库表格字段和字段对应的表格标题名称,例如 ZKLX - 钻孔类型
    std::map<QString, QString> mapShowFieldName;
    mapShowFieldName.insert(std::pair<QString, QString>("GCSY", "工程索引"));
    mapShowFieldName.insert(std::pair<QString, QString>("ZKBH", "钻孔编号"));
    mapShowFieldName.insert(std::pair<QString, QString>("ZKLX", "钻孔类型"));
    mapShowFieldName.insert(std::pair<QString, QString>("ZKX", "大地坐标E"));
    mapShowFieldName.insert(std::pair<QString, QString>("ZKY", "大地坐标N"));

    //定制表格单元项的编辑方式,例如:ZKX - {"3", "静探", "钻孔", "单桥"}
    // 1-字符串编辑框  2-整数编辑框  3-浮点数编辑框  4-组合框,  默认为Qt模型视图推荐的编辑框
    std::map<QString, QStringList> mapCellEdit;
    mapCellEdit.insert(std::pair<QString, QStringList>("工程索引", {"1"}));
    mapCellEdit.insert(std::pair<QString, QStringList>("钻孔编号", {"1"}));
    mapCellEdit.insert(std::pair<QString, QStringList>("钻孔类型", {"4", "静探", "钻孔", "单桥"}));
    mapCellEdit.insert(std::pair<QString, QStringList>("大地坐标E", {"3"}));
    mapCellEdit.insert(std::pair<QString, QStringList>("大地坐标N", {"3"}));

    //表格标题对应的富文本
    std::map<QString, QString> mapRichText;
    mapRichText.insert(std::pair<QString, QString>("工程索引", "<html><head/><body><p><sup>角标</sup>示例<sup>&%*</sup></p></body></html>"));
    mapRichText.insert(std::pair<QString, QString>("大地坐标N", "<html><head/><body><p><sup>角标</sup>示例<sup>&%*</sup></p></body></html>"));

    //展示数据库表格数据
    //获取应用程序所在路径
    QString appPath = QCoreApplication::applicationDirPath();
    QString sqlDbFile = "/../../../LZGicad1.geodb";
    //设置数据库文件信息
#ifdef Q_OS_LINUX
    // Linux OS
    qDebug() << "路径1:" << appPath + sqlDbFile;
    m_gridTable.setDbFileInfo(appPath + sqlDbFile);
#elif defined(Q_OS_WIN)
    // Windows OS
    qDebug() << "路径1:" << appPath + sqlDbFile;
    m_gridTable.setDbFileInfo(appPath + sqlDbFile);
#else
    // Other OS
#endif
    //设置要展示的数据表格名称、字段和字段对应的标题名称
    m_gridTable.setShowTableField("z_ZuanKong", mapShowFieldName);
    //设置单元项的编辑框样式(列)
    m_gridTable.setCellEdit(mapCellEdit);
    //设置标题对应的富文本
    m_gridTable.setRichText(mapRichText);
    //创建表格,展示数据
    m_gridTable.CreatorGridControl(this);

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值