查看完整版本: [-- zhengtianzuo系列-QTextEdit中插入Gif动画并显示 --]

QTCN开发网 -> Qt代码秀 -> zhengtianzuo系列-QTextEdit中插入Gif动画并显示 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

zhengtianzuo 2017-09-30 16:44

zhengtianzuo系列-QTextEdit中插入Gif动画并显示

早期我设计的IM消息输入框
开始采用的是RichEdit2.0, MFC环境下的. Gif的显示采用在RichEdit中嵌入ActiveX的方式, 现在想想也是很疯狂的事....
后来采用的是Qt Widgets中的QTextEdit, QTextEdit是支持html语言的, 所以可以直接通过调用insertHtml插入静态图片, 动态的Gif图呢?
其实也就是需要循环播放Gif中的多帧图片而已. 而QMovie是可以管理和播放Gif文件的. 官方的例子是这样的:


QLabel label;
QMovie *movie = new QMovie("animations/fire.gif");
label.setMovie(movie);movie->start();


那么我们可以这么实现, 直接上代码:


//插入Html描述的图片
insertHtml("<img src='" + url.toString() + "'/>");
//判断是否是相同的图片
if (m_lstUrls.contains(url)){return;}else{m_lstUrls.append(url);}
//创建QMovie以显示Gif
QMovie* movie = new QMovie(this);
movie->setFileName(fileName);
movie->setCacheMode(QMovie::CacheNone);
m_hasUrls.insert(movie, url);
//绑定帧切换信号槽
connect(movie, SIGNAL(frameChanged(int)), this, SLOT(subAnimate(int)));
movie->start();

然后每当frameChanged被触发的时候就调用subAnimate




//使用QMovie中的当前帧替换掉富文本中的图片元素
QMovie* movie = qobject_cast<QMovie*>(sender());
document()->addResource(QTextDocument::ImageResource,m_hasUrls.value(movie), movie->currentPixmap());
setLineWrapColumnOrWidth(lineWrapColumnOrWidth());



这样就是循环刷新显示gif动画的每一帧了







需要完整代码请访问 QtWidgetsExamples


圣域天子 2017-09-30 17:07
很原始的技术了,它的CPU占用率非常高,根本不实用

zhengtianzuo 2017-09-30 17:22
圣域天子:很原始的技术了,它的CPU占用率非常高,根本不实用 (2017-09-30 17:07) 

确实 目前我采用的是WebEngine的方式了, 后续会分享出来.

liuchangyin 2017-10-01 17:30

hehui 2017-10-10 08:28
zhengtianzuo:确实 目前我采用的是WebEngine的方式了, 后续会分享出来. (2017-09-30 17:22) 

WebEngine要带一个巨大的库。。。。。

zhengtianzuo 2017-10-10 08:53
hehui:WebEngine要带一个巨大的库。。。。。 (2017-10-10 08:28) 

对于开发模式和应用场景来说多几十M并不算什么

big_mouse 2020-04-22 09:10


查看完整版本: [-- zhengtianzuo系列-QTextEdit中插入Gif动画并显示 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled