QT 窗体上放GIF动态图

标签: 数据库 qt 界面 数据存储
372人阅读 评论(2) 收藏 举报
分类:

开发背景是这样的:当后台开始进行数据库更新,用户会看到一个等待界面。数据库更新完成后,等待界面自动消失。

操作数据库

QT提供多种数据存储方式,我们可以选择一种driver,然后用标准查询语句进行系列操作。
下面是非常简单的例子:

#include <QtSql/QSqlDatabase>
#include <QCoreApplication>
#include <QStringList>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>

int main(int argc, char **argv){
    QCoreApplication app(argc, argv);
    QStringList drivers = QSqlDatabase::drivers();
    foreach (QString it, drivers) {
        qDebug()<<it;
    }
    qDebug()<<"";
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("./student");
    if(db.open()){
        QSqlQuery query;
        if(!query.exec("create table today(title text)")){
            qDebug()<<"create: "<<query.lastError();
        }
        if(!query.exec("insert into today values('hello world')")){
            qDebug()<<"insert: "<<query.lastError();
        }
        if(!query.exec("select * from today")){
            qDebug()<<"create: "<<query.lastError();
        }
        while(query.next()){
            QString title = query.value(0).toString();
            qDebug()<<"title: "<<title;
        }
        db.close();
    }
    else qDebug()<<"db open failed.";
    return app.exec();
}

执行(先打印出能用的driver,然后使用QSlite存储数据):

"QSQLITE"
"QMYSQL"
"QMYSQL3"
"QODBC"
"QODBC3"
"QPSQL"
"QPSQL7"

title:  "hello world"

存储的数据库以二进制文件的方式存放在相应的路径下。
需要注意的是:
QSqlQuery的查询语句最好不要使用字符串拼接方式构造。那样不容易处理语句中的特殊字符,比如\n, \"等。
如下:

"insert into MessageTable values(1, 29, \"Warning\", 0, \"BluetoothController, NULL == argv\")"
"insert into MessageTable values(1, 30, \"Warning\", 0, \"mkdir(\"/pps/foryou/bluetooth\", 0777) = -1\")"
insert:  QSqlError("1", "Unable to execute statement", "near \"\", 0777) = -1\"\": syntax error")

"insert into MessageTable values(31, 27, \"Warning\", 0, \"CEQMcuFile::ParseRecDataPacket:CEQMcuFile, Unknown case:%d\\n\", pBuf[nTypePos]\")"
insert:  QSqlError("1", "Unable to execute statement", "near \"[nTypePos]\": syntax error")

"insert into MessageTable values(40, 3, \"LEVEL_WARNING\", 0, \"getProcessPid:opendir(\"/proc\")failed\")"
insert:  QSqlError("1", "Unable to execute statement", "near \"\")failed\"\": syntax error")

bindValue是我们需要的。

// 少用拼接查询字符串,避免语法错误
query.prepare("INSERT INTO MessageTable "
"VALUES (:Id, :Code, :Level, :Param, :Desc)");
query.bindValue(":Id", Id);
query.bindValue(":Code", Code);
query.bindValue(":Level", Level);
query.bindValue(":Param", Param);
query.bindValue(":Desc", Desc);

放置背景图片

  • 静态背景图片
  •     pic = new QImage(":/wait.png");
        this->setAutoFillBackground(true);
        QPalette palette;
        palette.setBrush(QPalette::Background,QBrush(*pic));
        this->setPalette(palette);

  • 动态背景图片 (gif)
  •     QMovie *movie = new QMovie(":/wait.gif");
        ui->label->setMovie(movie);
        movie->start();

    放置动态GIF图,我想多说两句。
    时钟就在一个新的线程中,属于开启了事件循环的线程
    我企图自己创建一个线程,然后在线程函数run中调用QMovie::jumpToNextFrame().

    gifRun::gifRun()
    {
        waitW = new waitWin();
        waitW->movie->start();
    }
    
    gifRun::~gifRun()
    {
        if(waitW != NULL){
            delete waitW;
            waitW = NULL;
        }
    }
    
    void gifRun::run()
    {
        while(1){
            qDebug()<<"hello";
            waitW->movie->jumpToNextFrame();
        }
    }

    当运行的时候出现问题了:

    QObject::killTimer: Timers cannot be stopped from another thread
    QObject::startTimer: Timers cannot be started from another thread

    而且父进程一旦进行其他操作,就会停止动态图。
    当我将父进程中的后台数据处理放在一个独立线程中(具体工作内容写于run函数,QThread::start()会调用run()),GIF图由QMovie自己管理(另一个线程)。两者可以同时正常工作:
    如图:

    查看评论

    在Qt中加入GIF动图

    qt 播放 gif
    • qq_24890953
    • qq_24890953
    • 2017-02-14 15:59:58
    • 1587

    Qt 之 QQ系统表情—实现动态显示效果

    简述在Qt 之 QQ系统表情(五) 中 我们实现了自定义系统表情窗口,这一篇将简单介绍如何实现QQ聊天界面中小表情窗口切换至正常表情窗口的动画效果。先看看QQ的效果: 当鼠标悬浮在表情按钮之上显示...
    • GoForwardToStep
    • GoForwardToStep
    • 2016-09-26 22:15:51
    • 3084

    QT 显示动态GIF

    以下内容转载或引用或参考 http://blog.csdn.net/mafujunfang/article/details/51921648 方法一:利用QMovie 显示...
    • pyf09
    • pyf09
    • 2017-06-05 20:16:23
    • 127

    qt显示动态图 gif

    #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv)...
    • my_friend_ship
    • my_friend_ship
    • 2014-09-28 13:54:09
    • 600

    Qt QGraphicsItem 添加 gif图片

    Qt QMovie类 显示gif动态图片  在QgraphicsItem中声明一个QMovie对象,然后重写paint, 在Moive start后, 调用每一帧绘制gif中的图像。代码: //声...
    • liulihuo_gyh
    • liulihuo_gyh
    • 2016-12-02 10:08:12
    • 823

    QT 显示动态gif图片 (release版)

    在ui界面添加Qlabel控件,在QLabel中使用QMovie播放gif。 #include "WaitDialog.h" #include #include WaitDialog::Wait...
    • chenyulancn
    • chenyulancn
    • 2016-05-11 10:52:00
    • 1911

    QT中显示gif动图

    gif动图显示QMovie *movie = new QMovie(":/Image/loading.gif"); ui->label->setMovie(movie); movie->sta...
    • liukang325
    • liukang325
    • 2016-11-21 13:09:24
    • 1013

    QT 显示动态GIF

    Qt 显示动态gif图片有以下几种方法:   方法一:利用QMovie 显示   QMovie *movie = new QMovie(":/GifPic/wait.gif"); ui...
    • mafujunfang
    • mafujunfang
    • 2016-07-15 23:18:41
    • 3061

    QT 窗体上放GIF动态图

    开发背景是这样的:当后台开始进行数据库更新,用户会看到一个等待界面。当数据库更新完成,等待界面自动消失。 操作数据库QT提供多种数据存储方式,我们可以选择一种然后用标准查询语句进行系列操作。 下面是...
    • theArcticOcean
    • theArcticOcean
    • 2017-11-10 22:35:07
    • 372
      个人资料
      持之以恒
      等级:
      访问量: 37万+
      积分: 9460
      排名: 2423
      我的链接
      最新评论