yafeilinux 发表于 2013-10-2 10:32:15

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

这个问题是一个网友的提出的,简单来说就是先全选并复制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们发挥想象吧!


Joey_Chan 发表于 2013-10-2 11:17:23

用html的确是显示图文混合的一个很好的途径

yafeilinux 发表于 2013-10-2 11:19:20

Joey_Chan 发表于 2013-10-2 11:17 static/image/common/back.gif
用html的确是显示图文混合的一个很好的途径

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

Marvelous 发表于 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:}

Marvelous 发表于 2013-10-2 12:39:28

yafeilinux 发表于 2013-10-2 11:19 static/image/common/back.gif
以前没有具体研究过剪贴板,现在才发现它里面全是html保存的,很实用啊,很多问题迎刃而解了。 ...

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

yafeilinux 发表于 2013-10-2 14:07:45

Marvelous 发表于 2013-10-2 12:39 static/image/common/back.gif
其实我有点奇怪 网上那么多同学们做的仿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;
    }
}

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

Marvelous 发表于 2013-10-2 14:47:11

yafeilinux 发表于 2013-10-2 14:07 static/image/common/back.gif
将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);



感谢版主回复 我明天上班了试一下{:3_48:}

Marvelous 发表于 2013-10-3 09:21:03

yafeilinux 发表于 2013-10-2 14:07 static/image/common/back.gif
将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);



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

11yichengming 发表于 2014-5-3 14:02:20

顶顶顶一个!!!!!!

madma 发表于 2015-8-23 21:02:53

牛逼顶一个:loveliness:!!!!!!!!!1

who_am_i_2015 发表于 2016-1-8 14:19:45

41,42哪去了?为啥中间断断续续的

yafeilinux 发表于 2016-1-8 19:13:42

who_am_i_2015 发表于 2016-1-8 14:19 static/image/common/back.gif
41,42哪去了?为啥中间断断续续的

呵呵,没有更新!

yanxuetao 发表于 2016-5-28 18:06:03

madma 发表于 2015-8-23 21:02 static/image/common/back.gif
牛逼顶一个!!!!!!!!!1

牛逼你好啊                  

qq1043068972 发表于 2016-5-28 22:33:41

yafeilinux 发表于 2013-10-2 14:07 static/image/common/back.gif
将label换成textEdit部件,然后在构造函数里面:
ui->textEdit->setAcceptRichText(true);



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

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

学习了

独钓江雪 发表于 2016-7-2 22:21:18

小白过来学习学习!哈哈

lightning_ 发表于 2016-7-14 17:15:22

哇,Qt太强大,看来学Qt是正确的。。。
页: [1]
查看完整版本: 将QQ中的图文聊天内容显示到Qt界面