一、直接添加图片
1.参考Qt的帮助文档,可支持的类型,即可以直接读取并显示的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。
2.显示图片步骤:
先打开一个图像;将图像文件加载进对象中;再用对象获得图像;最后用选择一个图像对象显示。
这是要插入的图片:
代码如下(在这之前需要在界面里添加一个控件,对象名为label):
QString filename(“F:\Study\junior\Qt\door\1.jpg”);
QImage* img=new QImage;
if(! ( img->load(filename) ) ) //加载图像
{
QMessageBox::information(this,
tr("打开图像失败"),
tr("打开图像失败!"));
delete img;
return;
}
ui->label->setPixmap(QPixmap::fromImage(*img));
显示的效果如图所示:
很明显只能显示图片的一小部分。
二、修改label的大小
设置大小的函数有()
所以在添加图片前加上这行代码可以先调整好label的大小。
ui->label->resize(img->width(),img->height());
显示结果:
好像图片过大了,label的大小已经超过了窗口的大小,还是不能完全显示,所以还是要找其他合适的解决方法。
我想label的大小范围是固定的,所以应该按比例缩放图片的大小,经过查阅资料有如下的方法:
首先用
label->setGeometry(0,0,400,300);//前两个参数表示label左上角位置后面分别是宽和高
函数设置lable的位置和大小,接着根据图片的大小缩放到合适的大小显示
图片缩放的相关函数是
img->scaled(width,height,Qt::KeepAspectRatio);
该函数前两个参数表示的是缩放之后图片的宽高,而第三个参数的作用是选择模式是否保持长宽比,相关的参数可以在qt的帮助文档中查看。接下来看使用了缩放之后的效果:
的确能够把画面全部显示出来了。下面是的构建代码:
{
ui->setupUi(this);
QString StrWidth,StrHeigth;
QString filename="F:\Study\junior\Qt\door\1.jpg";
QImage* img=new QImage,* scaledimg=new QImage;//分别保存原图和缩放之后的图片
if(! ( img->load(filename) ) ) //加载图像
{
QMessageBox::information(this,
tr("打开图像失败"),
tr("打开图像失败!"));
delete img;
return;
}
int Owidth=img->width(),Oheight=img->height();
int Fwidth,Fheight; //缩放后的图片大小
ui->label->setGeometry(0,0,400,300);
int Mul; //记录图片与label大小的比例,用于缩放图片
if(Owidth/400>=Oheight/300)
Mul=Owidth/400;
else
Mul=Oheight/300;
Fwidth=Owidth/Mul;
Fheight=Oheight/Mul;
*scaledimg=img->scaled(Fwidth,Fheight,Qt::KeepAspectRatio);
ui->label_text->setText(QString("width: ")+StrWidth.setNum(Fwidth)
+QString("nheight: ")+StrHeigth.setNum(Fheight));
ui->label->setPixmap(QPixmap::fromImage(*scaledimg));
}
其它:
2016.9.8
目标:在Qt的实现通过按钮控制在窗口中查看mjpeg-运行时本地显示的摄像头画面。
思路:原来在html中只要直接插入图片标签,对应的地址”/?=” ,在打开mjpeg-的时候,就能在网页中显示对应的画面,所以我想在qt的label中将该地址引用为图片是否就可以直接看到画面,接下来就直接在上次的基础上修改代码试试。
事实证明我想的太简单了,.load()只能打开本地的图片,对于网上的图片只能先保存为本地的图片然后再在控件里显示,所以接下来要解决的是如何获取网络上的图片。
查阅了资料之后发现就下载而言,Qt5的模块为我们提供了相当便利的接口,下面我就直接给出源码,相关的函数用法都可以参考帮助文档:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QNetworkAccessManager *manager;
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_replyFinished(QNetworkReply*)));
QNetworkRequest request;
request.setUrl(QUrl("http://www.bz55.com/uploads/allimg/150707/139-150FG51639-50.jpg"));
manager->get(request);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slot_replyFinished(QNetworkReply* reply)
{
QPixmap pix;
QByteArray data = reply->readAll();
pix.loadFromData(data, "JPG");
pix.save("/root/Qt/program/netpicture/tmp1.jpg", "JPG", 100);
ui->textEdit->resize(500,500);
ui->textEdit->append("");
}
要注意的是在.h里要写上
void MainWindow::slot_replyFinished(QNetworkReply* reply)
发表回复