当前位置: 首页 > article >正文

Qt之数据库的使用一

qt creator6.8

主要功能从数据库中读取数据,使用tableView进行显示。

qt框架中包含m/v结构  m指的是model(模型),v指的是view(视图)。这样可以使界面和数据分离开来。每当数据更新时,不会影响界面组件。

软件运行界面如下

程序分析window.h部分程序

private:
    QSqlDatabase DB;//数据库连接
    QSqlTableModel *tabModel;//数据模型
    QItemSelectionModel *selectModel;//选择模型
    QDataWidgetMapper *dataMapper;//数据映射

    TComboBoxDelegate delegateSex;//自定义数据代理 性别
    TComboBoxDelegate delegateDepart;//自定义数据代理 部门

    void openTable();
    void showRecordCount();

数显设置和数据库连接

void MainWindow::on_actOpenDB_triggered()
{
    QString aFile=QFileDialog::getOpenFileName(this,"选择文件","","QSLite数据库(*.db3)");
    if(aFile.isEmpty())
        return;
    DB=QSqlDatabase::addDatabase("QSQLITE");
    DB.setDatabaseName(aFile);
    if(DB.open())
        openTable();
    else
        QMessageBox::warning(this,"错误","打开数据库失败");
}

数据库连接成功,数据读取后在tableview中和当前记录组件展示(tableView中性别和部门使用了代理类)。

void MainWindow::openTable()
{
    tabModel =new QSqlTableModel(this,DB);//数据模型
    tabModel ->setTable("employee");//设置数据表
    tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    tabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder);
    if(!(tabModel->select()))
    {
        QMessageBox::critical(this,"错误信息","打开数据表错误,错误信息:\n"+tabModel->lastError().text());
        return;
    }
    showRecordCount();//显示记录条数
    //设置字段显示标题
    tabModel->setHeaderData(tabModel->fieldIndex("empNo"),Qt::Horizontal,"工号");
    tabModel->setHeaderData(tabModel->fieldIndex("Name"),Qt::Horizontal,"姓名");
    tabModel->setHeaderData(tabModel->fieldIndex("Gender"),Qt::Horizontal,"性别");
    tabModel->setHeaderData(tabModel->fieldIndex("Birthday"),Qt::Horizontal,"出生日期");
    tabModel->setHeaderData(tabModel->fieldIndex("Province"),Qt::Horizontal,"省份");
    tabModel->setHeaderData(tabModel->fieldIndex("Department"),Qt::Horizontal,"部门");
    tabModel->setHeaderData(tabModel->fieldIndex("Salary"),Qt::Horizontal,"工资");
    tabModel->setHeaderData(tabModel->fieldIndex("Memo"),Qt::Horizontal,"备注");
    tabModel->setHeaderData(tabModel->fieldIndex("Photo"),Qt::Horizontal,"照片");

    //创建选择模型
    selectModel=new QItemSelectionModel(tabModel,this);
 //行发生变化时
    connect(selectModel,&QItemSelectionModel::currentChanged,this,&MainWindow::do_currentChanged);
    connect(selectModel,&QItemSelectionModel::currentRowChanged,this,&MainWindow::do_currentRowChanged);
    //model/View 结构
    ui->tableView->setModel(tabModel);//设置数据模型
    ui->tableView->setSelectionModel(selectModel);//设置选择模型
    ui->tableView->setColumnHidden(tabModel->fieldIndex("Memo"),true);
    ui->tableView->setColumnHidden(tabModel->fieldIndex("Photo"),true);

    //为tableView中的性别和部门两个字段设置自定义代理组件
     QStringList strList;
     strList<<"男"<<"女";
     delegateSex.setItem(strList,false);
     ui->tableView->setItemDelegateForColumn(tabModel->fieldIndex("Gender"),&delegateSex);

    strList.clear();
    strList<<"技术部"<<"销售部"<<"市场部";
    delegateDepart.setItem(strList,false);
    ui->tableView->setItemDelegateForColumn(tabModel->fieldIndex("Department"),&delegateDepart);

    //字段与widget映射
    dataMapper=new QDataWidgetMapper(this);
    dataMapper->setModel(tabModel);
    dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
    dataMapper->addMapping(ui->spinBoxEmpNo,tabModel->fieldIndex("empNo"));
    dataMapper->addMapping(ui->lineEditName,tabModel->fieldIndex("Name"));
    dataMapper->addMapping(ui->comboBoxSex,tabModel->fieldIndex("Gender"));
    dataMapper->addMapping(ui->dateTimeEditBirth,tabModel->fieldIndex("Birthday"));
    dataMapper->addMapping(ui->comboBoxProvince,tabModel->fieldIndex("Province"));
    dataMapper->addMapping(ui->spinBoxSalary,tabModel->fieldIndex("Salary"));
    dataMapper->addMapping(ui->comboBoxDep,tabModel->fieldIndex("Department"));
    dataMapper->addMapping(ui->plainTextEdit,tabModel->fieldIndex("Memo"));
    dataMapper->toFirst();

    ui->actOpenDB->setEnabled(false);
    ui->actAppend->setEnabled(true);
    ui->actInsert->setEnabled(true);
    ui->actDelete->setEnabled(true);
    ui->actSave->setEnabled(true);
    ui->groupBoxSort->setEnabled(true);
    ui->groupBoxFilter->setEnabled(true);
    ui->actAddMoney->setEnabled(true);

    QSqlRecord emptyRec=tabModel->record();
    for(int i=0;i<emptyRec.count();i++)
    {
        ui->comboBoxFiles->addItem(emptyRec.fieldName(i));
    }
}

欢迎大家一起交流。


http://www.kler.cn/a/525897.html

相关文章:

  • 基于阿里云百炼大模型Sensevoice-1的语音识别与文本保存工具开发
  • HarmonyOS应用开发快速入门
  • 前端-Rollup
  • 爬虫基础(一)HTTP协议 :请求与响应
  • ios swift画中画技术尝试
  • 【信息系统项目管理师-选择真题】2007下半年综合知识答案和详解
  • 报错:MC1000未知的生成错误Invalid number of sections declared in PE header
  • react中如何实现组件通信
  • AI编程风潮下的生产力革命:从 Copilot 到 Trae
  • Java-多态(详解)
  • 记录使用EasyWeChat做微信小程序登陆和其他操作
  • OpenAI 宕机 | 如何让 k8s 集群更稳定
  • 基础位运算
  • AI时代来临:掌握信息收集,才能不被淘汰!!!
  • 实体类未设置字段如何不参与转化json?
  • Ubuntu中MySQL安装-02
  • 基于DeepSeek在藏语学习推广和藏语信息化方面可以做哪些工作?
  • 5.进程基本概念
  • fastadmin加密生成token
  • 数据分析系列--④RapidMiner进行关联分析(案例)
  • python编程环境安装保姆级教程--python-3.7.2pycharm2021.2.3社区版
  • 学习数据结构(4)顺序表+单链表
  • MySQL 索引存储结构
  • 在Windows上非ASCII(包括中文名)用户名导致Bazel不能使用的问题
  • 游戏开发领域 - 游戏引擎 UE 与 Unity
  • 从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架