Qt中插入图片并在label中显示

参考Qt的帮助文档,可支持的类型,即可以直接读取并显示的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。具体的步骤为:先打开一个图像;将图像文件加载进QImage对象中;再用QPixmap对象获得图像;最后用QLabel选择一个QPixmap图像对象显示。

第一步:在UI界面添加一个Label控件,对象名为label


 
 
  1. QString filename(“C:\\SensorsData\\BASLER\\code\\opencv\\vehicle.jpg”);
  2. QImage* img= new QImage;
  3. if(! ( img->load(filename) ) ) //加载图像
  4. {
  5. QMessageBox::information( this,
  6. tr( "打开图像失败"),
  7. tr( "打开图像失败!"));
  8. delete img;
  9. return;
  10. }
  11. ui->label->setPixmap(QPixmap::fromImage(*img));

上述路径为图片的路径,执行程序后,发现label只显示了图片的一小部分,因此需要修改label的大小

第二步:修改label的大小

Qlable设置大小的函数有resize(),所以在添加图片前加上这行代码可以先调整好label的大小。

ui->label->resize(img->width(),img->height());
 
 

但是运行后发现图片过大,label可能会超过设置的窗口的大小,还是不能完全显示,需要找到其它合适的方法。label的大小范围是固定的,所以应该按照比例缩放图片的大小,采用如下的方法。

第三步:按比例缩放图片大小

首先设置label的位置和大小

label->setGeometry(0,0,400,300);//前两个参数表示label左上角位置后面分别是宽和高
 
 

接着根据图片的大小缩放到合适的大小显示,图片缩放的相关函数是

img->scaled(width,height,Qt::KeepAspectRatio);
 
 

该函数前两个参数表示的是缩放之后图片的宽高,而第三个参数的作用是选择模式是否保持长宽比,下面是完整的构建函数的代码


 
 
  1. {
  2. ui->setupUi( this);
  3. QString StrWidth,StrHeigth;
  4. QString filename= "F:\\Study\\junior\\Qt\\door\\1.jpg";
  5. QImage* img= new QImage,* scaledimg= new QImage; //分别保存原图和缩放之后的图片
  6. if(! ( img->load(filename) ) ) //加载图像
  7. {
  8. QMessageBox::information( this,
  9. tr( "打开图像失败"),
  10. tr( "打开图像失败!"));
  11. delete img;
  12. return;
  13. }
  14. int Owidth=img->width(),Oheight=img->height();
  15. int Fwidth,Fheight; //缩放后的图片大小
  16. ui->label->setGeometry( 0, 0, 400, 300);
  17. int Mul; //记录图片与label大小的比例,用于缩放图片
  18. if(Owidth/ 400>=Oheight/ 300)
  19. Mul=Owidth/ 400;
  20. else
  21. Mul=Oheight/ 300;
  22. Fwidth=Owidth/Mul;
  23. Fheight=Oheight/Mul;
  24. *scaledimg=img->scaled(Fwidth,Fheight,Qt::KeepAspectRatio);
  25. ui->label_text->setText(QString( "width: ")+StrWidth.setNum(Fwidth)
  26. +QString( "\nheight: ")+StrHeigth.setNum(Fheight));
  27. ui->label->setPixmap(QPixmap::fromImage(*scaledimg));
  28. }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QtQTableView,可以通过自定义一个QStyledItemDelegate类来实现在表格插入图片的功能。具体步骤如下: 1. 继承QStyledItemDelegate类,重写createEditor、setEditorData、setModelData、updateEditorGeometry和paint方法。 2. 在createEditor方法,创建一个QFileDialog,让用户选择图片文件。 3. 在setEditorData方法,将文件路径转换成QPixmap对象,然后将其设置为QLabel的pixmap。 4. 在setModelData方法,将QPixmap对象转换成QByteArray,然后将其存储到model。 5. 在updateEditorGeometry方法,设置QLabel的位置和大小。 6. 在paint方法,绘制QPixmap。 以下是一个简单的示例代码: ```cpp class ImageDelegate : public QStyledItemDelegate { public: QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override { Q_UNUSED(option); Q_UNUSED(index); QFileDialog* dialog = new QFileDialog(parent); dialog->setFileMode(QFileDialog::ExistingFile); dialog->setNameFilter(tr("Images (*.png *.xpm *.jpg)")); if (dialog->exec() != QDialog::Accepted) { return nullptr; } QLabel* editor = new QLabel(parent); QPixmap pixmap(dialog->selectedFiles().first()); editor->setPixmap(pixmap.scaledToHeight(40, Qt::SmoothTransformation)); editor->setAlignment(Qt::AlignCenter); editor->setFixedSize(pixmap.width() / 4, pixmap.height() / 4); return editor; } void setEditorData(QWidget* editor, const QModelIndex& index) const override { QString imagePath = index.model()->data(index, Qt::EditRole).toString(); QPixmap pixmap(imagePath); QLabel* label = static_cast<QLabel*>(editor); label->setPixmap(pixmap.scaledToHeight(40, Qt::SmoothTransformation)); } void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override { QPixmap pixmap = static_cast<QLabel*>(editor)->pixmap(Qt::ReturnByValue); QByteArray byteArray; QBuffer buffer(&byteArray); buffer.open(QIODevice::WriteOnly); pixmap.save(&buffer, "PNG"); model->setData(index, byteArray, Qt::EditRole); } void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override { Q_UNUSED(index); editor->setGeometry(option.rect); } void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override { QByteArray imageData = index.model()->data(index, Qt::DisplayRole).toByteArray(); QPixmap pixmap; pixmap.loadFromData(imageData); painter->drawPixmap(option.rect, pixmap.scaled(option.rect.width() - 2, option.rect.height() - 2, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } }; ``` 然后在QTableView设置该delegate即可: ```cpp ImageDelegate* delegate = new ImageDelegate(); tableView->setItemDelegateForColumn(0, delegate); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值