qlabel添加图标_Qt中⽤QLabel显⽰图⽚
⼀、直接添加图⽚
1.参考Qt的帮助⽂档,可⽀持的类型,即可以直接读取并显⽰的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。
2.显⽰图⽚步骤:
先打开⼀个图像;将图像⽂件加载进QImage对象中;再⽤QPixmap对象获得图像;最后⽤QLabel选择⼀个QPixmap图像对象显⽰。
这是要插⼊的图⽚:
代码如下(在这之前需要在界⾯⾥添加⼀个Qlabel控件,对象名为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->tPixmap(QPixmap::fromImage(*img));
显⽰的效果如图所⽰:
很明显只能显⽰图⽚的⼀⼩部分。
⼆、修改label的⼤⼩
Qlable设置⼤⼩的函数有resize()
所以在添加图⽚前加上这⾏代码可以先调整好label的⼤⼩。ui->label->resize(img->width(),img->height());
显⽰结果:
好像图⽚过⼤了,label的⼤⼩已经超过了窗⼝的⼤⼩,还是不能完全显⽰,所以还是要找其他合适的解决⽅法。
我想label的⼤⼩范围是固定的,所以应该按⽐例缩放图⽚的⼤⼩,经过查阅资料有如下的⽅法:
⾸先⽤
label->tGeometry(0,0,400,300);//前两个参数表⽰label左上⾓位置后⾯分别是宽和⾼
函数设置lable的位置和⼤⼩,接着根据图⽚的⼤⼩缩放到合适的⼤⼩显⽰
图⽚缩放的相关函数是
img->scaled(width,height,Qt::KeepAspectRatio);
该函数前两个参数表⽰的是缩放之后图⽚的宽⾼,⽽第三个参数的作⽤是选择模式是否保持长宽⽐,相关的参数可以在qt的帮助⽂档中查看。接下来看使⽤了缩放之后的效果:
的确能够把画⾯全部显⽰出来了。下⾯是mainwindows的构建代码:
{
ui->tupUi(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->tGeometry(0,0,400,300);
int Mul; //记录图⽚与label⼤⼩的⽐例,⽤于缩放图⽚
if(Owidth/400>=Oheight/300)
Mul=Owidth/400;
el
Mul=Oheight/300;
簧网
英语戏剧Fwidth=Owidth/Mul;
Fheight=Oheight/Mul;
*scaledimg=img->scaled(Fwidth,Fheight,Qt::KeepAspectRatio);
ui->label_text->tText(QString("width: ")+StrWidth.tNum(Fwidth)
+QString("\nheight: ")+StrHeigth.tNum(Fheight));
ui->label->tPixmap(QPixmap::fromImage(*scaledimg));
}
2016.9.8
⽬标:在Qt的实现通过按钮控制在窗⼝中查看mjpeg-streamer运⾏时本地显⽰的摄像头画⾯。
思路:原来在html中只要直接插⼊图⽚标签,对应的地址"/?action=stream" ,在打开mjpeg-streamer
的时候,就能在⽹页中显⽰对应的画⾯,所以我想在qt的label中将该地址引⽤为图⽚是否就可以直接看到画⾯,接下来就直接在上次的基础上修改代码试试。
事实证明我想的太简单了,p_w_picpath.load()只能打开本地的图⽚,对于⽹上的图⽚只能先保存为本地的图⽚然后再在控件⾥显⽰,所以接下来要解决的是如何获取⽹络上的图⽚。查阅了资料之后发现就下载⽽⾔,Qt5的QtNetwork模块为我们提供了相当便利的接⼝,下⾯我就直接给出源码,相关的函数⽤法都可以参考帮助⽂档:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->tupUi(this);
QNetworkAccessManager *manager;
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_replyFinished(QNetworkReply*)));
QNetworkRequest request;
request.tUrl(QUrl("/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("");
}大一学年个人总结
无患子的功效要注意的是在mainwindow.h⾥要写上
void MainWindow::slot_replyFinished(QNetworkReply* reply)
这个槽函数的声明并且加上
#include
#include
#include
大的成语这⼏个头⽂件,在.pro⽂件中加上
QT+= network
这⼀⾏,接下来就可以编译运⾏了。
代码中链接对应的图⽚就显⽰在了textEdit控件中了,当然在
“/root/Qt/program/netpicture”⽬录下也成功的下载了这个图⽚(不然也⽆法显⽰)。
2016.9.10
<
2016.9.11
前⾯那个链接对应的是⼀个流,这才是⼀个静态图⽚。
还有⼀个难点是在执⾏了manager->get(request);并不能⽴即调⽤槽函数,所以紧接着执⾏在label中显⽰图⽚的语句的话会出现图⽚打开失败的错误提⽰,我想应该是向链接发出访问请求是需要⼀⼩段时间的虽然很短但还是⽐两⾏命令之间的时间差要长很多,所以我在这两⾏命令之间添加了延时代码,要注意的是不能调⽤系统的sleep()函数,因为这样你的控件就会失去响应,当然label上的画⾯也就不会刷新了。
接下来就直接贴出代码,这⾥我也将获取到的画⾯⾃动缩放到640*480⼤⼩:
QString PU="192.168.253.3:8080/?action=snapshot";
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->tupUi(this);
SetWindow();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::PicConnect(QString PicUrl)
{ //connect to picture
QNetworkAccessManager *manager;
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_replyFinished(QNetworkReply*)));
QNetworkRequest request;
request.tUrl(QUrl(PicUrl));
manager->get(request);
}
void MainWindow::slot_replyFinished(QNetworkReply* reply) { //save the picture
QPixmap pix;
QByteArray data = reply->readAll();
pix.loadFromData(data, "JPG");
pix.save("/root/Qt/program/netpicture/tmp1.jpg", "JPG", 100); }
void MainWindow::SetWindow()
{ //t the window with one label and pushButton
this->resize(800,600);
ui->PicLabel->tGeometry(10,10,640,480);
ui->PicLabel->tText("");
ui->PicButton->tGeometry(300,500,30,15);
isPicOnLabel=fal;
ui->PicButton->tText("Show");
}
void MainWindow::on_PicButton_clicked()
{
if(isPicOnLabel==fal)
{
ShowPic();
星光下的童话
}
el
{
StopPic();
}
}
void MainWindow::ShowPic()
{
isPicOnLabel=true;
ui->PicButton->tText("stop");
while(1)