关闭

QT 窗体上放GIF动态图

标签: 数据库qt界面数据存储
182人阅读 评论(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自己管理(另一个线程)。两者可以同时正常工作:
    如图:

    0
    0
    查看评论
    发表评论
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

    Qt 使用QMovie加载gif图片实现动态等待窗口

    Qt 使用QMovie加载gif图片实现动态等待窗口
    • xiongxuanwen
    • xiongxuanwen
    • 2016-04-21 17:24
    • 1915

    Qt Quick播放Gif动画

    Qt Quick提供了一个类 AnimatedImage ,可以播放 Gif 动画,使用简单,这里是一个示例。
    • foruok
    • foruok
    • 2014-12-02 12:47
    • 9724

    [Qt]一个简单的Qt Widget多线程处理图像的例子

    最近开始学习Qt。发现Qt的资料比起不好用的MFC实在是不多啊。今天刚好看到了Qt多线程,就写了个小例子放出来,希望能帮到跟我一样的初学者。 简单讲下。程序就两个界面。一个主要的QDialog,...
    • imxiangzi
    • imxiangzi
    • 2015-11-11 17:29
    • 2578

    matlab中实现GIF动态图

    • 2017-12-26 16:21
    • 64KB
    • 下载

    GIF动态图制作-UleadGIFAnimator绿色版

    • 2013-07-14 09:50
    • 6.53MB
    • 下载

    爬取gif动态图的程序,java实现

    • 2013-12-05 11:20
    • 279KB
    • 下载

    python爬虫(19)爬取论坛网站——网络上常见的gif动态图

    写在前面的话~ 有段时间没有写爬虫相关的文章了,今天抽时间把之前做的一个程序分享给大家。 经常逛A站和B站的人,肯定对一个节目不陌生《网络上常见的GIF动态图》 今天就来分享一下,怎么通过爬虫自动的将...
    • qiqiyingse
    • qiqiyingse
    • 2017-11-10 16:58
    • 808

    Android中使用Movie显示gif动态图

    在看这篇博文之前对attr自定义属性还是不是很熟的童鞋可以先看看:Android中attr详解(http://blog.csdn.net/u012975705/article/details/4871...
    • u012975705
    • u012975705
    • 2015-09-24 20:21
    • 7564

    Android 下如何录制App操作生成Gif动态图

    版权声明:转载请注明出处 博客地址 http://blog.csdn.net/never_cxb 目录(?)[+] 需求 Android App开发完了,...
    • asmcvc
    • asmcvc
    • 2016-01-15 17:03
    • 3874

    如何用AS录制手机屏幕并转成gif动态图

    如何通过视频文件来制作gif动态图
    • zsr0526
    • zsr0526
    • 2017-03-25 23:03
    • 1244
      个人资料
      • 访问:326973次
      • 积分:8804
      • 等级:
      • 排名:第2518名
      • 原创:574篇
      • 转载:13篇
      • 译文:0篇
      • 评论:36条
      我的链接
      最新评论