qt之数据库的使用二

server/2025/2/2 15:00:42/

本章主要介绍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();elseQMessageBox::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.ppmy.cn/server/164358.html

相关文章

大数据挖掘--两个角度理解相似度计算理论

文章目录 0 相似度计算可以转换成什么问题1 集合相似度的应用1.1 集合相似度1.1文档相似度1.2 协同过滤用户-用户协同过滤物品-物品协同过滤 1.2 文档的shingling--将文档表示成集合1.2.1 k-shingling1.2.2 基于停用词的 shingling 1.3 最小哈希签名1.4 局部敏感哈希算法&#…

如何在Windows、Linux和macOS上安装Rust并完成Hello World

如何在Windows、Linux和macOS上安装Rust并完成Hello World 如果你刚刚开始学习Rust,第一步就是安装Rust并运行你的第一个程序!本文将详细介绍如何在Windows、Linux和macOS上安装Rust,并编写一个简单的“Hello, World!”程序。 1. 安装Rust …

Signature

Signature 题目是: import ecdsaimport random​def ecdsa_test(dA,k):​sk ecdsa.SigningKey.from_secret_exponent(secexpdA,curveecdsa.SECP256k1)sig1 sk.sign(databHi., kk).hex()sig2 sk.sign(databhello., kk).hex()#不同的kr1 int(sig1[:64], 16)s1 i…

JavaEE:多线程编程中的同步与并发控制

JavaEE:多线程进阶2 一、Callable 接口1. 基本定义和接口签名2. Callable 接口的特点2.1 返回值2.2 异常处理2.3 灵活性 3. Callable 接口的劣势4. Callable 接口的使用场景4.1 需要返回结果的任务4.2 可能抛出异常的任务4.3 需要组合多个任务的结果 5. 总结 二、Re…

OFDM系统仿真

1️⃣ OFDM的原理 1.1 介绍 OFDM是一种多载波调制技术,将输入数据分配到多个子载波上,每个子载波上可以独立使用 QAM、PSK 等传统调制技术进行调制。这些子载波之间互相正交,从而可以有效利用频谱并减少干扰。 1.2 OFDM的核心 多载波调制…

FreeRTOS 列表和列表项

在 FreeRTOS 的源码中大量地使用了列表和列表项,因此想要深入学习 FreeRTOS,列表和列表项是必备的基础知识。这里所说的列表和列表项,是 FreeRTOS 源码中 List 和 List Item 的直译,事实上,FreeRTOS 中的列表和列表项就…

LLM:BERT or BART 之BERT

文章目录 前言一、BERT1. Decoder-only2. Encoder-only3. Use of Bidirectional Context4. Masked Language Model (MLM)5. Next Sentence Prediction (NSP)6. Fine-tune1、情感分析2、句对分析3、命名实体识别(NER) 7. BERT总结 总结 前言 NLP选手对这…

EigenLayer联合Cartesi:打造面向主流用户的DeFi、AI等新用例

EigenLayer 与 Cartesi 正在开展合作,致力于弥合基础设施协议与终端用户应用之间的鸿沟;鼓励核心开发人员构建人工智能代理、复杂 DeFi、游戏、社交网络等应用场景;得益于 Cartesi 基于 Linux 的协处理器,开发者可复用现有软件库和…