Qt技巧:QTextEdit显示网络图片

Qt5的QNetworkAccessManager 类可以很方便的访问网络资源,QNetworkRequest类可以用于发送网络请求,而QNetworkReply则负责接收处理网络资源;今天遇到一个问题,如何在QTextEdit上显示一张网络图片,用了几种办法,最终终于解决了,在这里分享一下。

方法一:直接显示
    QTextEdit有一个属性,就是可以借助html标记来插入图片,例如:

 
ui->textEdit->append("<img< span="" style="word-wrap: break-word;"> src=c://tmp1.jpg>");

    于是,首先想到的办法就是修改  "<img< span="" style="word-wrap: break-word;"> src=c://tmp1.jpg>" 中的url,将其替为http://xxxx.jpg,如下:
 
ui->textEdit->append("<img< span="" style="word-wrap: break-word;"> src=http://img0.bdstatic.com/img/image/shouye/dengni63.jpg>");
 

     但结果是,我太异想天了,经过试验,证明这种方法只适用于本地图片。


方法二:先下载保存至本地,然后再加载图片

    既然 <img< span="" style="word-wrap: break-word;"> src=xxx>无法解析网络资源,那么就把图片资源下载下来,保存到本地,当作本地文件来显示吧。那么,现在的问题就变成怎么下载和保存资源文件了。
    就下载而言,Qt5的QtNetwork模块为我们提供了相当便利的接口,这里就不讲了。
    说说保存网络图片数据吧。
    原始的做法是读取网络资源的原始数据,再经过对应格式的转换,变成我们需要的文件。这里由于保存的是图片文件,因此可以使用QPixmap的QPixmap::loadFromData和QPixmap::save方法。
    我们来看官方的文档说明:
bool QPixmap::loadFromData(const QByteArray * data, 
                            uint len, 
                            const char * format = 0,
                            Qt::ImageConversionFlags flags = Qt::AutoColor);
其中:
 
 
const QByteArray * data : 图片的原始数据(二进制、字节数组
uint len : 图片数据长度
const char * format : 图片格式(支持的格式见下图)
 
Qt::ImageConversionFlags flags :图片转换标识8-bit/32-bit(支持的标识如下图)


支持的图片格式:


支持的图片转换标识:


    接下来看QPixmap::save :
bool QPixmap::save(const QString & fileName, const char * format = 0, int quality = -1) const;
其中:
const QString & fileName : 希望保存的图片名称
 
const char * format : 希望保存图片格式
int quality : 希望保存的图片质量(-1为默认值,若自定义,则取之区间为[0-100],0为最大压缩,100为不压缩,即原始图片)

    好了,基本知识掌握之后就可以来写代码了,主要部分粘贴如下:

 
 //构造函数
MainWindow::MainWindow(QWidget *parent) :
 QMainWindow(parent),
 ui(new Ui::MainWindow)
{
 ui->setupUi(this);
 pixmap = new QPixmap;
 manager = new QNetworkAccessManager(this);
 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_replyFinished(QNetworkReply*)));
 QNetworkRequest request;
 request.setUrl(QUrl("http://img0.bdstatic.com/img/image/shouye/dengni63.jpg"));
 manager->get(request);
}
 //槽函数
void MainWindow::slot_replyFinished(QNetworkReply* reply)
{
 QPixmap pix;
 QByteArray data = reply->readAll();
 pix.loadFromData(data, "JPG");
 pix.save("c://tmp1.jpg", "JPG", 100);
 ui->textEdit->append("<img< span="" style="word-wrap: break-word;"> src=c://tmp1.jpg>");
}


看下效果,哈哈,度娘图片首页推荐的图片,不要想太多:


PS:
   之后会研究QTextEdit的拖拽复制功能,日后提供更新。


from: http://blog.chinaunix.net/uid-29650836-id-4470466.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值