int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
MovieModel movieModel;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("myMovieModel",&movieModel);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("D:/myMovie.db");
if (!db.open())
qDebug() << "Failed to connect";
else
{
qDebug() <<"succeed!";
}
当数据库打开成功后,就需要查询指定的数据,下面给出一个查询的实现。要使用QSqlQuery类,所以记得添加头文件。该函数的功能是根据movieID这个参数,去数据库查找该ID的所在行的所有记录,通过query.value(i).toString()输出该行记录中索引值i指向的数据。
QString MovieModel::getMovieInfo(QString movieID)
{
QString movieInfo;
QSqlQuery query;
QString sqlQuery=QString("select * from MovieTable WHERE(movieID='%1')").arg(movieID);
query.exec(sqlQuery);
query.next();
movieInfo = query.value(0).toString();
return movieInfo;
}
在moviemodel.h中使用Q_INVOKABLE申明getMovieInfo(QString movieID)函数,这样qml就能直接调用函数传入movieID值去获取数据库中存放的数据。
5,网络图片访问。本应用以来与豆瓣提供的数据,json数据被解析存放在数据库中,数据库内包含了电影名字,演职员,剧情概要,电影类型,评分等,对于Demo中显示的图片,数据库内只有图片的网络路径,所以程序需要去访问网络图片。而qml访问网络图片的速度其实比较慢的,加载速度很慢,如果数据库中上千部电影,当我们滑动加载时,就会发现速度非常慢,但是qml加载本地图片速度快了很多倍,因此最后实现的方式是用C++实现一个函数去访问网络图片然后下载到本地,将图片的本地地址返回给qml。代码如下:
QString MovieModel::getMovieImgUrl(QString movieID,QString url)//QString url是从数据库中获取的图片网络路径
{
QString imgUrl = "j:/movieImg"+movieID+".jpg";//本地存储路径
if(!QFile::exists(imgUrl))//如果本地没有该图片
{
QImage currentPicture;
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
QEventLoop eventLoop;
QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
eventLoop.exec();
currentPicture.loadFromData(reply->readAll());
currentPicture.save(imgUrl,0,100);
}
return "file:///"+imgUrl;//返回图片的本地路径,qml中若使用了资源系统,那么访问本地文件时需要加file:///+本地路径
}