前两天,一位朋友问我,怎么把图片上传到数据库,然后从数据库读取以及显示。因为我也刚学Qt,所以很多东西不清楚,然后我就去百度了一些例子,发现网上的例子都写的模模糊糊。今天终于把这个功能写好了,现在整理一下,分享给大家。
首先我们要知道这几个类:QPixmap QByteArray QFile,关于Qt中数据库的使用方法可以自行百度。
整体思路是这样的,通过QFile类读取图片,把二进制数据储存到QByteArray中,然后把QByteArray储存到数据库中,读取的时候再把数据库中的二进制数据读取出来,储存到QByteArray,再用QPixmap加载QByteArray以显示。
首先通过QFile打开文件,然后读取文件中的内容到QByteArray中:
QByteArray mdata;
QFile *file=new QFile(path);
file->open(QIODevice::ReadOnly);
mdata=file->readAll();
file->close();
然后将QByteArray中的数据储存到数据库中:
QSqlQuery query;
query.prepare("UPDATE sql_cmsb SET poto = ? WHERE cms_id = 30");
query.addBindValue(mdata);
if(query.exec())
QMessageBox::information(this,tr("提示"),tr("上传成功"));
由于我再main函数中已经添加了QSqlDatabase,所以这里不要问我为什么不创建数据库连接等等。这时就将图片储存到数据库中了,大家可以发现这个方法可以储存任何形式的文件(当然,本人只是这样推测,具体没有去实践)。
然后我们就可以进行第二步了:读取数据库中的数据,以及把它显示出来。
QSqlQuery query;
QPixmap poto;
query.exec("select poto from sql_cmsb where cms_id=30");
query.first();
poto.loadFromData(query.value(0).toByteArray());
ui->label->setPixmap(poto);
QPixmap类有个loadFromData的成员函数,它可以直接从QByteArray中读取数据进行分析,最后就是label的setPixmap方法把QPixmap显示在label控件上。
自此就算结束了,大家有兴趣的话,可以储存其他文件,比如exe文件,视频文件等,记住同时储存它们的文件格式,由于某些文件不能直接从内存中读取,还是放在本地中再进行其他操作比较好,操作完了删掉即可。这篇文章是自己进行一个总结,也希望能帮助到其他人。