最近跟着同学第一次完成了一个小项目,项目大概意思就是设计一个PC端的应用,通过分析人的照片得到关节的一些数据,医生可以通过这些数据进行康复诊断。我主要负责的是其中的数据库搭建部分,前端用的Qt,后端的数据库增删改查操作都用Qt内部的接口实现
QT += core gui sql
QSqlDatabase sql;
//声明使用的是MySQL的驱动
sql = QSqlDatabase::addDatabase("QMYSQL");
//连接云服务器的ip地址,我这里的是本地地址
sql.setHostName("127.0.0.1");
//服务器部署的数据库用户名
sql.setUserName("");
//密码
sql.setPassword("");
//端口,数据库默认3306
sql.setPort(3306);
//数据库名字
sql.setDatabaseName("testmysql01");
sql.open();
//检查是否成功打开
if(sql.open())
qDebug()<<"yes";
这样的话,我们的连接就成功了
在进行连接的当中还容易出现这样的问题
驱动可用但是没有装载,网上给出的解答办法也很多。我是通过MySQL官网下载MySQL-connector-win32,将其中lib目录下的libmysql.dll移动到与项目相关的build文件夹中来解决的。下载的时候注意32位还是64位,别搞错了
Qt提供了QSqlQuery类来完成指定的数据库查询工作,只要你熟悉SQL语言,写下来还是非常方便的,我这里直接贴代码了
//存用户的姓名、检测时间、以及角度
void api2(QString name, QString angle,double grades, QString comment, unsigned int liaocheng)
{
//获取当前时间
QDateTime time = QDateTime::currentDateTime();
QString t = time.toString("yyyy-MM-dd hh:mm:ss");
//这里就是之前的连接数据库操作
QSqlDatabase sql;
login_connectfirst(sql);
QSqlQuery query;
QString str = QString("insert into records(name,date,angle,trial,grade,No) values('%1','%2','%3','%4','%5','%6')").arg(name).arg(t).arg(angle).arg(liaocheng).arg(grades).arg(no);
no += 1;
//exec执行语句
query.exec(str);
//避免数据库一直连接,在执行完一个操作之后我将连接中断
sql.close();
}
下面这个是query的另外一种执行方法
//3.增加存储疗程信息的接口
//前序任务:数据库结构1.
//输入为treatment的各项信息
//其中不包括No,photo为电脑文件系统的一个图片地址
//输出为1添加成功,-1添加失败
int store_treatment(QString doc,QString patient,QString action,int act_time,QString keyword,QString weight,QString photo_path){
QSqlDatabase sql;
login_connectfirst(sql);
/*
存取图片 mysql当中采用mediumblob存储,将图片转化成一个大二进制文件存储,因此我们需要先在Qt当中
*/
QByteArray bytes;
QBuffer buffer(&bytes);
buffer.open(QIODevice::WriteOnly);
QByteArray data;
QFile* file=new QFile(photo_path); //file为二进制数据文件名
file->open(QIODevice::ReadOnly);
data = file->readAll();
file->close();
QVariant var(data);
QSqlQuery query;
QString str = QString("insert into treatment(doctor,patient_name,action_name,action_times,points_angles,weights,photo)"
"values('%1,'%2','%3','%4','%5','%6',?)")
.arg(doc).arg(patient).arg(action).arg(act_time).arg(keyword).arg(weight);
//由于图片在Qt中转为二进制文件后,无法通过QString类型的arg代入参数,故采用第二种绑定参数的模式
query.prepare(str);
query.addBindValue(var);
bool p = query.exec(str);
sql.close();
if(p)
return 1;
else
return -1;
}
//大同小异
int delete_user(QString name){
QSqlDatabase sql;
login_connectfirst(sql);
QString str = QString("delete from accounts where name='%1").arg(name);
QSqlQuery query;
bool ans = query.exec(str);
sql.close();
if(ans){
return 1;
}else
return -1;
}
int reset_pwd(QString name){
QSqlDatabase sql;
login_connectfirst(sql);
QString str = QString("update accounts set passwd=12345reset where name='%1'").arg(name);
QSqlQuery query;
bool ans = query.exec(str);
sql.close();
if(ans){
return 1;
}else
return -1;
}
void doctor_return_history(QString name,QString treatment,QTableWidget *table){
QSqlDatabase sql;
login_connectfirst(sql);
//从records当中获得评分和No
QString str1 = QString("select count(*) from records where name='%1',trial='%2'")
.arg(name).arg(treatment);
QString str = QString("select No,grade from records where name='%1',trial='%2'")
.arg(name).arg(treatment);
//从treatment当中获取其他
QString str2 = QString("select points,angles,weights from treatment where name='%1',action_name='%2'")
.arg(name).arg(treatment);
QSqlQuery query2;
query2.exec(str2);
QSqlQuery query;
query.exec(str1);
query.next();
int ans = query.value(0).toInt();
//使用QTableWidget显示查询到的内容
table->setColumnCount(5);
table->setRowCount(ans);
//加头文件QStringList才能这样用
table->setHorizontalHeaderLabels(QStringList()<<"No"<<"分数"<<"关键点"<<"角度"<<"权重");
query.exec(str);
int row = 0;
while(query.next()){
for(int i = 0;i < 2;i++){
table->setItem(row,i,new QTableWidgetItem(query.value(i).toString()));
}
for(int i = 2;i < 5;i++){
table->setItem(row,i,new QTableWidgetItem(query2.value(i-2).toString()));
}
row++;
}
sqlclose();
}
query.exec(QString) – 执行相关的SQL语句
执行后的结果可以通过query.value()查看,query.value(0/1/2…)分别表示返回结果中的第一个字段、第二个字段的值…
注意query一开始处于的位置并不是查询得到的结果列的第一个位置,而是处于结果列的前一个位置,也就是空位,所以要得到查询的结果之前,必须先要执行一个query.next()
query会向后移动一个位置,这个时候query处于的位置才会使结果集的第一个结果处。
Qt本身提供的功能也非常的多,比如还可以连接python脚本得到一系列的结果,这些网上都有详细的说明