找回密码
 立即注册
收起左侧

将QQ中的图文聊天内容显示到Qt界面

15
回复
17329
查看
[复制链接]
累计签到:1568 天
连续签到:1 天
来源: 2013-10-2 10:32:15 显示全部楼层 |阅读模式
这个问题是一个网友的提出的,简单来说就是先全选并复制QQ聊天内容(里面包含图片),然后将其显示到Qt的界面上。实际这个问题就是如何将剪贴板上的内容显示出来,默认的文本是没有问题的,但是包含图片就会出现问题,下面分步骤来演示讲解。

1.下面是聊天内容截图:



2.然后我们在程序中添加一个按钮和一个标签,先复制所有的聊天内容,然后运行程序,单击按钮时让标签中显示复制的内容。

这里主要是修改按钮单击信号对应的槽中的代码:

void MainWindow::on_pushButton_clicked()
{   
   const QClipboard *clipboard = QApplication::clipboard();   
   const QMimeData *mimeData = clipboard->mimeData();   
  if (mimeData->hasHtml()) {        
         QString html = mimeData->html();      
         ui->label->setText(html);        
        qDebug() <<"html: " <<  html;        
        ui->label->setTextFormat(Qt::RichText);   
       }
}

运行程序,按下按钮,效果如下图所示:



3.在上面的代码中我已经测试过了,mimeData返回的内容中只包含html内容,所以只获取了html内容。为什么图片无法显示呢,我们查看一下输出的html内容:

html:  "<!--StartFragment--><!--StartFragment --><DIV>
yafeilinux 2013-9-30 16:52:47<br><IMG src="file:///D:\Program Files\Tencent\QQ\Users\188581941\Image\1NFHJL2G18M6V$WBRDUPDN1.jpg" ><br><br>hehehehhe <br>yafeilinux 2013-9-30 17:02:12<br><IMG src="file:///D:\Program Files\Tencent\QQ\Users\188581941\Image\C3@@APJ04@`M~F}6RGT@5(4.jpg" ><br><br>
</DIV><!--EndFragment-->"


4.可以看到这里的图片src路径内容为file:///D:\Program Files\Tencent\QQ\Users\188581941\Image\1NFHJL2G18M6V$WBRDUPDN1.jpg,

这不是我们的标准路径,所以图片无法显示,我们需要将“file:///”去掉,然后把后面的“\”都更换为“/”,所以修改代码如下:

void MainWindow::on_pushButton_clicked()
{   
      const QClipboard *clipboard = QApplication::clipboard();   
      const QMimeData *mimeData = clipboard->mimeData();   
       if (mimeData->hasHtml()) {        
               QString html = mimeData->html();        
               html.replace(QString("\\"), QString("/"));       
              html.remove("file:///");        
               ui->label->setText(html);        
              qDebug() <<"html: " <<  html;      
              ui->label->setTextFormat(Qt::RichText);   
              }
}

5.再次运行程序,先复制聊天窗口的内容,然后按下按钮,效果出来了:



不仅如此,复制其他所有的副文本格式也是没有问题的,例如复制百度网页内容:



复制word文档内容:




另外,word中的表格、艺术字、图表、绘图都是可以显示的啊。呵呵,是不是感觉恍然大悟,原来显示word文档还可以这样来做!




呵呵,这段代码用处可就大了,Qter们发挥想象吧!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 3人气 +4 收起 理由
jinlingren1122 + 1
jakes + 2 很实用!
xgqter + 1 很实用!

查看全部评分总评分 : 人气 +4

回复

使用道具 举报

尚未签到

2013-10-2 11:17:23 显示全部楼层
用html的确是显示图文混合的一个很好的途径
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-10-2 11:19:20 显示全部楼层
Joey_Chan 发表于 2013-10-2 11:17
用html的确是显示图文混合的一个很好的途径

以前没有具体研究过剪贴板,现在才发现它里面全是html保存的,很实用啊,很多问题迎刃而解了。
回复 支持 反对

使用道具 举报

累计签到:114 天
连续签到:1 天
2013-10-2 12:31:13 显示全部楼层
版主你好 很感激你为我的问题做出研究
其实QTextBrowser 如果setReadOnly = false  或者QWebView
把Qclipboard的html设置进去 也能做到与你同样的效果

可是我想把QClipboard里的图文插入到QTextEdit里 因为可能会有修改图文的情况
而QTextEdit提供了很强大的编辑功能 所以我想使用QTextEdit
QTextEdit也是可以显示图片的 但是需要加到QT资源里

我想的解决方案是重载QTextEdit的粘贴事件
循环QClipboard的HTML 如果碰到<img 则把这个图片加载到资源
这样就能在QTextEdit显示了
并且资源里的图片与QTextEdit中的HTML 能上传到数据库 保存

还是希望能再指点一二
再次感谢版主的支持
国庆快乐{:soso_e179:}
回复 支持 反对

使用道具 举报

累计签到:114 天
连续签到:1 天
2013-10-2 12:39:28 显示全部楼层
yafeilinux 发表于 2013-10-2 11:19
以前没有具体研究过剪贴板,现在才发现它里面全是html保存的,很实用啊,很多问题迎刃而解了。 ...

其实我有点奇怪 网上那么多同学们做的仿QQ程序 或者是富文本编辑器  居然都没带有图文混合这个功能
我一直以为这个功能应该网上早就有相关资料了 但是我把网上的代码都看了
所有人的做法都是点击按钮选择图片 然后把图片加入到资源 最后加入到QTextEdit里
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-10-2 14:07:45 显示全部楼层
Marvelous 发表于 2013-10-2 12:39
其实我有点奇怪 网上那么多同学们做的仿QQ程序 或者是富文本编辑器  居然都没带有图文混合这个功能{:3_44 ...

将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);


然后更该按钮的函数:

void MainWindow::on_pushButton_clicked()
{
    const QClipboard *clipboard = QApplication::clipboard();
    const QMimeData *mimeData = clipboard->mimeData();
    if (mimeData->hasHtml()) {
        QString html = mimeData->html();
        html.replace(QString("\\"), QString("/"));
        html.remove("file:///");
        ui->textEdit->setHtml(html);
        qDebug() <<"html: " <<  html;
    }
}

这样设置完成后是可以编辑的。至于修改成使用“粘贴菜单”也是可以的,不过我建议直接往上面添加一个右键菜单就好了,这样简单点。

点评

ui->textEdit->setAcceptRichText(true);原来textEdit这样就可以显示图片了,我一直都是 QTextDocumentFragment fragment = QTextDocumentFragment::fromHtml(""); ui->textEdit->textCursor().insertFragment(  详情 回复 发表于 2016-5-28 22:33
回复 支持 反对

使用道具 举报

累计签到:114 天
连续签到:1 天
2013-10-2 14:47:11 显示全部楼层
yafeilinux 发表于 2013-10-2 14:07
将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);

感谢版主回复 我明天上班了试一下
回复 支持 反对

使用道具 举报

累计签到:114 天
连续签到:1 天
2013-10-3 09:21:03 显示全部楼层
yafeilinux 发表于 2013-10-2 14:07
将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);

非常非常感谢版主 代码是可用的 看来之前是我一直走错了方向 以为必须要把图片加入资源 QTextEdit才能显示
我的小项目可以继续进行的 真心感谢版主
后面只要把图片上传到服务器 然后在保存的HTML里进行处理就好了
回复 支持 反对

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-5-3 14:02:20 显示全部楼层
顶顶顶一个!!!!!!
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2015-8-23 21:02:53 显示全部楼层
牛逼顶一个!!!!!!!!!1
回复 支持 反对

使用道具 举报

累计签到:83 天
连续签到:1 天
2016-1-8 14:19:45 显示全部楼层
41,42哪去了?为啥中间断断续续的
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2016-1-8 19:13:42 显示全部楼层
who_am_i_2015 发表于 2016-1-8 14:19
41,42哪去了?为啥中间断断续续的

呵呵,没有更新!
回复 支持 反对

使用道具 举报

累计签到:17 天
连续签到:1 天
2016-5-28 18:06:03 显示全部楼层
madma 发表于 2015-8-23 21:02
牛逼顶一个!!!!!!!!!1

牛逼  你好啊                    
回复 支持 反对

使用道具 举报

累计签到:615 天
连续签到:1 天
2016-5-28 22:33:41 显示全部楼层
yafeilinux 发表于 2013-10-2 14:07
将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);

ui->textEdit->setAcceptRichText(true);原来textEdit这样就可以显示图片了,我一直都是

QTextDocumentFragment fragment = QTextDocumentFragment::fromHtml("<img src=':\\Experiment.png'>");
    ui->textEdit->textCursor().insertFragment(fragment);

学习了
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-7-2 22:21:18 显示全部楼层
小白过来学习学习!哈哈
回复 支持 反对

使用道具 举报

累计签到:4 天
连续签到:1 天
2016-7-14 17:15:22 显示全部楼层
哇,Qt太强大,看来学Qt是正确的。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了