Bootstrap

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

欢迎大家一起交流。

;