• Qt SQLite的创建和使用


    重点:

    1.SQLite创建数据库内容方法

    链接:SQLite Expert Personal的简单使用-CSDN博客

    2.和数据库进行链接方法

    1. QSqlDatabase DB; //数据库连接
    2. bool MainWindow::openDatabase(QString aFile)
    3. {
    4. DB=QSqlDatabase::addDatabase("QSQLITE"); //添加 SQLITE数据库驱动
    5. DB.setDatabaseName(aFile); //设置数据库名称
    6. if (!DB.open()) //打开数据库失败
    7. return false;
    8. else
    9. {
    10. openTable(); //打开数据表
    11. return true;
    12. }
    13. }

     3.QTableView和QSqltableModedl、QItemSelectionModel关系

    1. /打开数据表
    2. void MainWindow::openTable()
    3. {
    4. //1. 创建数据模型,打开数据表
    5. tabModel=new QSqlTableModel(this,DB); //数据模型
    6. tabModel->setTable("employee"); //设置数据表
    7. tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit); //数据保存方式,OnManualSubmit , OnRowChange
    8. tabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder); //排序
    9. if (!(tabModel->select())) //查询数据失败
    10. {
    11. QMessageBox::critical(this, "错误信息",
    12. "打开数据表错误,错误信息:\n"+tabModel->lastError().text());
    13. return;
    14. }
    15. showRecordCount(); //显示记录条数
    16. //2. 设置字段显示标题
    17. tabModel->setHeaderData(tabModel->fieldIndex("empNo"), Qt::Horizontal, "工号");
    18. tabModel->setHeaderData(tabModel->fieldIndex("Name"), Qt::Horizontal, "姓名");
    19. tabModel->setHeaderData(tabModel->fieldIndex("Gender"), Qt::Horizontal, "性别");
    20. tabModel->setHeaderData(tabModel->fieldIndex("Birthday"), Qt::Horizontal, "出生日期");
    21. tabModel->setHeaderData(tabModel->fieldIndex("Province"), Qt::Horizontal, "省份");
    22. tabModel->setHeaderData(tabModel->fieldIndex("Department"), Qt::Horizontal, "部门");
    23. tabModel->setHeaderData(tabModel->fieldIndex("Salary"), Qt::Horizontal, "工资");
    24. //这两个字段不在tableView中显示
    25. tabModel->setHeaderData(tabModel->fieldIndex("Memo"),Qt::Horizontal,"备注");
    26. tabModel->setHeaderData(tabModel->fieldIndex("Photo"),Qt::Horizontal,"照片");
    27. //3. 创建选择模型
    28. selModel=new QItemSelectionModel(tabModel,this); //关联选择模型
    29. //当前行或列变化时发射currentChanged信号
    30. connect(selModel,&QItemSelectionModel::currentChanged,
    31. this,&MainWindow::do_currentChanged);
    32. //当前行变化时发射currentRowChanged()信号
    33. connect(selModel,&QItemSelectionModel::currentRowChanged,
    34. this,&MainWindow::do_currentRowChanged);
    35. //4. Model/View结构
    36. ui->tableView->setModel(tabModel); //设置数据模型
    37. ui->tableView->setSelectionModel(selModel); //设置选择模型
    38. ui->tableView->setColumnHidden(tabModel->fieldIndex("Memo"),true); //隐藏列
    39. ui->tableView->setColumnHidden(tabModel->fieldIndex("Photo"),true); //隐藏列
    40. //5. 为tableView中的“性别”和“部门”两个字段设置自定义代理组件
    41. QStringList strList;
    42. strList<<"男"<<"女";
    43. bool isEditable=false;
    44. delegateSex.setItems(strList,isEditable);
    45. ui->tableView->setItemDelegateForColumn(
    46. tabModel->fieldIndex("Gender"),&delegateSex); //设置代理组件
    47. strList.clear();
    48. strList<<"销售部"<<"技术部"<<"生产部"<<"行政部";
    49. isEditable=true;
    50. delegateDepart.setItems(strList,isEditable);
    51. ui->tableView->setItemDelegateForColumn(
    52. tabModel->fieldIndex("Department"),&delegateDepart); //设置代理组件
    53. //6. 创建界面组件与数据模型的字段之间的数据映射
    54. dataMapper= new QDataWidgetMapper(this);
    55. dataMapper->setModel(tabModel); //设置数据模型
    56. dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit); //数据更新方式
    57. //界面组件与数据模型的具体字段之间的联系
    58. dataMapper->addMapping(ui->dbSpinEmpNo,tabModel->fieldIndex("empNo"));
    59. dataMapper->addMapping(ui->dbEditName,tabModel->fieldIndex("Name"));
    60. dataMapper->addMapping(ui->dbComboSex,tabModel->fieldIndex("Gender"));
    61. dataMapper->addMapping(ui->dbEditBirth,tabModel->fieldIndex("Birthday"));
    62. dataMapper->addMapping(ui->dbComboProvince,tabModel->fieldIndex("Province"));
    63. dataMapper->addMapping(ui->dbComboDep,tabModel->fieldIndex("Department"));
    64. dataMapper->addMapping(ui->dbSpinSalary,tabModel->fieldIndex("Salary"));
    65. dataMapper->addMapping(ui->dbEditMemo,tabModel->fieldIndex("Memo"));
    66. dataMapper->toFirst(); //移动到首记录
    67. //7. 获取字段名称列表,填充groupBoxSort
    68. getFieldNames();
    69. //8.更新actions和界面组件的使能状态
    70. ui->actOpenDB->setEnabled(false); //不能再打开数据库
    71. ui->actRecAppend->setEnabled(true);
    72. ui->actRecInsert->setEnabled(true);
    73. ui->actRecDelete->setEnabled(true);
    74. ui->actScan->setEnabled(true);
    75. ui->groupBoxSort->setEnabled(true); //"排序"分租框
    76. ui->groupBoxFilter->setEnabled(true); //"数据过滤"分组框
    77. }

    4.设置设置自定义代理组件

    1. //5. 为tableView中的“性别”和“部门”两个字段设置自定义代理组件
    2. QStringList strList;
    3. strList<<"男"<<"女";
    4. bool isEditable=false;
    5. delegateSex.setItems(strList,isEditable);
    6. ui->tableView->setItemDelegateForColumn(
    7. tabModel->fieldIndex("Gender"),&delegateSex); //设置代理组件
    8. strList.clear();
    9. strList<<"销售部"<<"技术部"<<"生产部"<<"行政部";
    10. isEditable=true;
    11. delegateDepart.setItems(strList,isEditable);
    12. ui->tableView->setItemDelegateForColumn(
    13. tabModel->fieldIndex("Department"),&delegateDepart); //设置代理组件

  • 相关阅读:
    【Linux】进程信号
    美团搜索粗排优化的探索与实践
    线程的创建方式
    Oracle 快照及 dblink使用 (两台服务器数据同步)
    一个注解替换synchronized关键字:分布式场景下实现方法加锁
    操作系统-进程同步、进程互斥(王道视频p26、课本ch6)
    java版冒泡排序------>基础版
    YBTOJ 期望分数【第31章 期望问题】
    设计模式-原型模式
    阿里云网络、数据中心和服务器技术创新优势说明
  • 原文地址:https://blog.csdn.net/qq_38409301/article/details/136355761