【QT开发(5)】0919-QT里面新增ui类,新增使用opencv读取图片的普通类,在ui类中显示图片

2023-09-19 16:53:47

参考资料

1、Qt Creator快速入门_第三版__霍亚飞编著
2、《Qt+OpenCV显示图片(Mat转QImage然后显示在QLabel上)》

输出材料

https://gitee.com/hiyanyx/qt5.14-cpp_-empty_-project/tree/508435b09ff1f794e650cba859b0db2323ec333a/

新增文件布局

新增ui类

c.cpp  
c.h
c.ui

新增使用opencv读取图片的普通类

A.cpp
A.h

在这里插入图片描述

具体步骤

1.1 创建新增使用opencv读取图片的普通类

为了更加方便,可在QT 中添加普通类,这样会自动生成一些模板语句,方便使用。然后再A.h 在引入opencv 头文件#include <opencv2/opencv.hpp>。在成员中增加 图片路径成员image_name和 cv的图像数据结构Mat 的成员img1。以及增加了成员函数int test()

/*
 * =========================== A.h ==========================
 *                                        CREATE --
 *                                        MODIFY -- 
 * ----------------------------------------------------------
 */
#ifndef CLASS_A_H
#define CLASS_A_H

#include "innDebug.h"
#include <opencv2/opencv.hpp>


class A{
public:
    A( int data_ ): data(data_){
        debug::log( "class A: Constructor" );
    }

    ~A(){
        debug::log( "class A: Destructor" );
    }

    inline int get_data()const noexcept{
        return this->data;
    } 

    int test();
    cv::Mat img1;

private:
    int data;
    std::string image_name = "/var/GPU1NFSshare/LaneDetection_End2End/DATASET/images/1.jpg";

};

void print_A_data( const A &a_ );

#endif

然后修改A.cpp 文件,撰写成员test()函数:用opencv 读取图片。

/*
 * =========================== A.cpp ==========================
 *                                        CREATE --
 *                                        MODIFY -- 
 * ----------------------------------------------------------
 */
#include "A.h"
#include "pch.h"


void print_A_data( const A &a_ ){
    debug::log( "a.data = {}", a_.get_data() );
}

int A::test()
{
    std::string image_name = "1.jpg";
    //this pointer can distinguish same name var
    debug::log(this->image_name);
    this->img1 = cv::imread(this->image_name, -1);
    if (!this->img1.data ) {
        debug::log("fail to imread");
        return -1;
    }
    else
    {
        //cv::imshow("source image", img1);
        //cv::waitKey(1);
        debug::log("success to imread");
    }

    return 1;
}

在这里插入图片描述

2.1 创建c.ui文件

在这里插入图片描述

进入可视化设计界面。默认情况中间的主设计区下已经有一个QMainWindow和QWidget的对象。我们需要将采集到图像显示到一个QLabel的部件上,从右侧的部件列表的“DisplayWidget”中选择“Label”部件拖动到中间.

在这里插入图片描述

1.2 创建c类

在这里插入图片描述

在c.cpp 中写下在c.ui 在显示图片的语句。主要是将Mat对象转为QImage对象并使用Qt显示出来的步骤如下:

1.将使用OpenCV imread函数加载一张图片

2.将Mat转为QImage

3.将QImage转为QPixmap

4.将QPixmap放到QLabel上并显示出来

首先导入头文件

#include <QImage>
#include "A.h"

然后在c.cpp 写

#include "c.h"
#include "ui_c.h"

c::c(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::c)
{
    ui->setupUi(this);

	//初始化A类,实例化b
    A b(0);
    //在b中进行图片读取
    b.test();
    // Mat convert to QImage
    QImage dst = QImage(b.img1.data,b.img1.cols,b.img1.rows,b.img1.step,QImage::Format_BGR888);
    // 在ui中显示图像
    ui->label->setPixmap(QPixmap::fromImage(dst));
}

c::~c()
{
    delete ui;
}

补充讲解:ui文件是什么?

可以理解:ui 就是一种可以自动生成 h 头文件的可视化编程工具。与自己写QT 可视化界面代码的效果是一模一样的。
在这里插入图片描述

我们尝试使用代码写一个界面aboutme界面,而不用ui设计工具。

1、 头文件中引入

#include <QtWidgets/QPushButton>
#include <QMessageBox>

2、 在c类,设计abouteme 函数,申明函数QPushButton *about_button;,例如下列头函数的书写:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtWidgets/QPushButton>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void aboutme();


private:
    Ui::MainWindow *ui;
    QPushButton *about_button;

};
#endif // MAINWINDOW_H

3、然后在cpp 中撰写详细代码

void MainWindow::aboutme(){
    QMessageBox *about_message=new QMessageBox(this);
    about_message->setWindowTitle("??");
    about_message->setText("name yanyx\n"
                           "QQ \n"
                           "date");
    about_message->exec();
}

4、在c 类引入button 按钮,并关联aboutme 函数

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // aboute me button
    about_button=new QPushButton(this);
    connect(about_button,SIGNAL(clicked()),this,SLOT(aboutme()));
    about_button->setText("about");
    about_button->setGeometry(8,8,90,30);

}

效果:

在这里插入图片描述

更多推荐

三分钟图解事务隔离级别

详细见:三分钟图解事务隔离级别,看一遍就懂数据库中事务指的是什么“锁"是数据库系统区别于文件系统的一个关键特性,其对象是事务,用来锁定的是数据库中的对象,如表、页、行等。锁确实提高了并发性,但是却不可避免地存在一些潜在的并发一致性问题。不过好在锁只会带来四种问题(丢失更新、脏读、不可重复读、幻读),如果可以防止这四种情

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

优质项目专栏:提升自身的硬实力:汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用CSDN平台,自主完成项目设计升级,提升自身的硬实力。专栏订阅:项目大全提升自身的硬实力资料合集更优惠第一期资料合集:https://download.csdn.net/download/sinat_39620217/8

一文详解 requests 库中 json 参数和 data 参数的用法

在requests库当中,requests请求方法,当发送post/put/delete等带有请求体的请求时,有json和data2个参数可选。众所周知,http请求的请求体格式主要有以下4种:application/jsonapplicaiton/x-www-from-urlencodedmultipart/form

03-JavaScript-函数

函数就是将特定功能的代码封装起来,当需要实现特定功能时,直接调用函数实现即可。一、函数定义和使用1.1定义函数语句式命名函数functionsum(a,b){returna+b;}变量函数表达式是一个匿名函数,它没有函数名letsum=function(a,b){returna+b;};1.2调用函数按顺序传入参数co

网络基础-应用层协议-HTTP/HTTPS

HTTP/HTTPSHTTP基本概念协议格式请求报文请求方法请求资源地址协议版本应答报文常见Header常见状态码与状态描述Cookie&Sessionhttp协议特点HTTPS基本概念对称加密与非对称加密数据摘要&数据指纹HTTPS工作过程探究只采用对称加密只采用非对称加密双方都采用非对称加密对称加密+非对称加密中间

手机提词器有哪些?简单介绍这一款

手机提词器有哪些?手机提词器在现代社会中越来越受欢迎,原因是它可以帮助人们提高演讲和朗读的效果。使用手机提词器可以让人们更加自信地面对演讲和朗读,不至于出现口误或读错字的情况。此外,手机提词器还可以帮助人们节省时间和精力,让人们可以更加专注于演讲和朗读的内容。目前市面上有很多种手机提词器,今天就给大家介绍一款好用的手机

Harmony系统更改手机IP

在当今的互联网环境中,我们经常需要更改手机的IP地址来绕过限制或保护我们的隐私。虽然在一些操作系统上更改IP地址相对较容易,但在Harmony系统上,这可能会有些困难。因此,本文将分享一种在Harmony系统上免费更改手机IP地址的方法。在Harmony系统上,我们可以通过使用VPN(VirtualPrivateNet

前端原生和主流框架是如何dom的

前言随着互联网技术的发展,前端技术也在不断地发展和更新。DOM(DocumentObjectModel)是前端开发中非常重要的一个概念,可以理解为网页上的所有元素都是DOM节点,通过操作这些节点,可以实现网页的动态效果和交互功能。本文将介绍JavaScript操作DOM、jQuery操作DOM、Vue操作DOM、Rea

C++之list

目录一、关于list二、list相关函数三、相关函数的使用1、构造函数2、push_back3、迭代器4、push_front5、pop_back6、insert7、erase关于迭代器失效问题8、splice9、remove10、sort一、关于listlist和string、vector一样,都是容器,都有很强的相

服务器如何提供性能呢?

服务器如何提供性能呢?一、将服务器虚拟化如果同期拥有多个项目,增加额外服务器会显得浪费,成本费用也会大幅度上升,这时不妨通过技术将其划分成多个虚拟空间,而每个空间又可以使用不同操作系统,运行不同应用程序,使得符合项目要求。这种方式通常能增加当前利用率,而不必投资额外的服务器。比如虚拟主机、VPS、云服务器等,就是服务器

spark 数据倾斜优化总结

一、数据倾斜产生原因数据倾斜就是部分task承担了过多的计算任务,导致整个stage都被卡。可能产生数据倾斜的场景如下操作场景join其中一个表比较小,但key值少join大表与大表,但key值中存在过多的特殊值,如0或nulljoinon条件包含key值过滤逻辑,导致部分数据被保留,部分被过滤,最终节点分布不均joi

热文推荐