早期我设计的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
|