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

qt之数据库的使用二

本章主要介绍qt的数据库的查询功能。

在上一篇qt之数据库的文章基础上增加了数据库的查询功能,软件界面上增加了首记录,前一条,后一条,尾记录按钮。软件界面如下

部分程序如下

MainWindow.h如下

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

    TComboBoxDelegate delegateSex;//自定义数据代理 性别
    TComboBoxDelegate delegateDepart;//自定义数据代理 部门
    void selectData();
    void openTable();
    void showRecordCount();
    void refreshTableView();
private slots:
    void on_actFirst_triggered();

    void on_actPrevious_triggered();

    void on_actNext_triggered();

    void on_actLast_triggered();

第一步,进行数据库连接并查询数据库,代码如下

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())
        selectData();
        //openTable();
    else
        QMessageBox::warning(this,"错误","打开数据库失败");
}

void MainWindow::selectData()
{
    QString str="SELECT empNo,Name,Gender,Birthday,Province,department,"
                  "Salary From employee ORDER BY empNo";
    qryModel =new QSqlQueryModel(this);
    qryModel->setQuery(str);
    if(qryModel->lastError().isValid())
    {
        QMessageBox::critical(this,"错误","数据表查询错误,错误信息\n"
                              +qryModel->lastError().text());
        return;
    }
    ui->statusbar->showMessage(QString("记录条数:%1").arg(qryModel->rowCount()));
    QSqlRecord rec=qryModel->record();
    qryModel->setHeaderData(rec.indexOf("empNo"),Qt::Horizontal,"工号");
    qryModel->setHeaderData(rec.indexOf("Name"),Qt::Horizontal,"姓名");
    qryModel->setHeaderData(rec.indexOf("Gender"),Qt::Horizontal,"性别");
    qryModel->setHeaderData(rec.indexOf("Birthday"),Qt::Horizontal,"出生日期");
    qryModel->setHeaderData(rec.indexOf("Province"),Qt::Horizontal,"省份");
    qryModel->setHeaderData(rec.indexOf("Department"),Qt::Horizontal,"部门");
    qryModel->setHeaderData(rec.indexOf("Salary"),Qt::Horizontal,"工资");
    //创建数据模型
    selectModel=new QItemSelectionModel(qryModel,this);
    connect(selectModel,&QItemSelectionModel::currentRowChanged,this,&MainWindow::do_currentRowChanged);
    ui->tableView->setModel(qryModel);
    ui->tableView->setSelectionModel(selectModel);

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

    dataMapper->toFirst();


     ui->actOpenDB->setEnabled(false);


}

 

记录按钮功能程序实现如下

void MainWindow::on_actFirst_triggered()
{
    dataMapper->toFirst();
     refreshTableView();
}


void MainWindow::on_actPrevious_triggered()
{
    dataMapper->toPrevious();
     refreshTableView();
}


void MainWindow::on_actNext_triggered()
{
    dataMapper->toNext();
     refreshTableView();
}


void MainWindow::on_actLast_triggered()
{
    dataMapper->toLast();
    refreshTableView();
}
void MainWindow::refreshTableView()
{
    int index=dataMapper->currentIndex();
    QModelIndex curIndex=qryModel->index(index,1);
    selectModel->clearSelection();
    selectModel->setCurrentIndex(curIndex,QItemSelectionModel::Select);
}

refreshTableView() 作用是刷新slectModel 当前位置 。

当selectModel索引 位置发生变化时,照片和备注的的变化需要 单独一个槽函数去响应。

代码如下

void MainWindow::do_currentRowChanged(const QModelIndex &current,const QModelIndex &previous)
{
     Q_UNUSED(previous);
    if(!current.isValid())
     {
         ui->labelPic->clear();
        ui->plainTextEdit->clear();
     }
    dataMapper->setCurrentModelIndex(current);
    bool first=(current.row()==0);
    bool last=(current.row()==qryModel->rowCount()-1);
    ui->actFirst->setEnabled(!first);
    ui->actPrevious->setEnabled(!first);
    ui->actNext->setEnabled(!last);
    ui->actLast->setEnabled(!last);

    int curRecNo=selectModel->currentIndex().row();
    QSqlRecord curRec=qryModel->record(curRecNo);
    int empNo=curRec.value("EmpNo").toInt();


    QSqlQuery query;
    query.prepare("select Memo, Photo from employee where EmpNo= :ID");
    query.bindValue(":ID",empNo);
    query.exec();
    query.first();
    QVariant va=query.value("Photo");
    if(!va.isValid())
        ui->labelPic->clear();
    else
    {
        QByteArray data=va.toByteArray();
        QPixmap pic;
        pic.loadFromData(data);
        ui->labelPic->setPixmap(pic.scaledToWidth(ui->labelPic->size().width() ));
    }
    QVariant va2=query.value("Memo");
    ui->plainTextEdit->setPlainText(va2.toString());

}

欢迎大家一起交流。

 


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

相关文章:

  • vue3中el-input无法获得焦点的问题
  • 你了解哪些Java限流算法?
  • 【16届蓝桥杯寒假刷题营】第2期DAY4
  • 《深度揭秘:TPU张量计算架构如何重塑深度学习运算》
  • floodfill算法(6题)
  • Kubernetes 环境中的自动化运维实战指南
  • grpc 和 http 的区别---二进制vsJSON编码
  • 青少年编程与数学 02-008 Pyhon语言编程基础 10课题、列表与循环语句
  • 替代传统汽车行业FTP传输方式,实现数字化重大转型
  • 本地部署DeepSeekp R1教程
  • 如何用KushoAI提升API自动化测试效率:AI驱动的革命
  • FreeRTOS学习 --- 任务调度
  • 实现基础的shell程序
  • 6 齐次坐标模块(homogen.rs)
  • Spring框架IOC依赖注入功能详细使用指南
  • java_自定义异常
  • 350.两个数组的交集 ②
  • SSM开发(九) mybatis多表查询(举例说明)
  • Python3 【装饰器】水平考试和答案
  • 复杂场景使用xpath定位元素
  • 计算机网络 笔记 网络层 3
  • C++ deque(1)
  • 元旦和春节取名的历史变迁
  • ESP32-S3模组上跑通esp32-camera(38)
  • 嵌入式系统|DMA和SPI
  • GitHub上传文件异常 显示this file is hidden