从安装到实现,零基础利用QT完成简易图像处理

目录

         一、QT的下载和安装

官网下载地址

安装QT

配置环境

 二、新建一个工程

三、图像缩放


一、QT的下载和安装

        下载QT之前,我们应该先知道QT是什么,QT可以做什么?

        Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面Qt 。虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等。

        接下来我们就开始下载QT吧

        1、点击exe文件,选择next

       2、登录Qt账号。如果没有账号就先在此页面注册,需要注意的是账号密码至少7个字符,必须包括以下四种类型中的三种:小写字母、大写字母、数字、符号(**!"#/()=?@${[]}\,.-_|;:'*^~+**)

         新用户注册完之后,点击邮箱收到的激活链接进行激活,激活之后回到安装页面进行登录即可。

3.勾选下图中的红框,点击下一步(next)

 4、点击next

5、 选择合适的安装路径(注:不能出现空格和中文,不建议装在C盘)

         6、选择组件。其中MSVC需要与相对应的Visual Studio版本匹配才可以使用,Qt5.14.2仅支持VS2015和VS2017。

         在这里我仅选择了“MSVC 2017 64-bit” 和 “MinGW 7.3.0 64-bit”(有其他需要大家可以按需选择)

7.点击下一步,等待安装

安装成功啦!

  • 配置环境

1.找到QT的安装路径以及工具的路径,并复制下来  

        2、此电脑右击->属性->高级系统设计->环境变量->双击Path->将Qt的安装路径和工具的路径添加到环境变量中。

至此,环境变量也配置成功了!

 二、新建一个工程

        进入QT主界面,可以看到在左侧分别有欢迎界面、文件编辑界面、可视化窗口编辑界面、调试界面、项目属性设置界面、帮助界面。如下所示:

        1、切换到欢迎界面,点击新建一个工程,选择第一个“QT Widgets Application"。点击右下角的choose

(Widgets是部件的意思,Widgets Application 部件应用程序)

        2、填写自己的工程名,注意不要有空格,项目位置不要有中文名,点击下一步

        3、编译系统默认即可

4、 类名自行命名。

QT有三个基类:QMainWindow,QWidget,QDialog。

QMainWindow:提供菜单条和一个状态条的应用程序窗口

QWidget:所有用户界面对象的基类,空白窗口

QDialog:对话框的基类,一种主要用于传递消息的交互窗口

此处我们可以选择QWidget即可。

5、选择语言

6、选择编译环境

7、点击完成

8、点击运行,如若出现一个空白界面,则表示新建项目成功

三、图像缩放

        终于把准备工作做完啦,现在我们可以正式开始写代码了!

        在这之前,我们首先来了解一个QT的文件结构,切换到编辑界面

        我们的代码主要在窗口类源文件和窗口类头文件中编写。

        在编写代码之前,我们先来了解一个重要的概念:信号和槽(slot)

        信号和槽用于两个对象之间的通信。当一个特殊的事情发生时便可以发射一个信号,比如按钮被单击就发射clicked()信号;而槽就是一个函数,它在信号发射后被调用来响应这个信号。 

        下面我们在运用中进一步来了解信号和槽机制
        以下是窗口头文件和窗口源文件的一些基本代码解释:

#ifndef WIDGET_H //防止重复定义
#define WIDGET_H
#include <QWidget> //包含Qt的QWidget类的头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
        Q_OBJECT //允许使用信号和槽机制
public:
    Widget(QWidget *parent = nullptr); //类的构造函数
    ~Widget(); //析构函数
private:
  Ui::Widget *ui; //把Ui::Widget作为一个私有类,可以通过它来访问在Qt设计师中设计的窗口部件
};
#endif // WIDGET_H
 

图像处理

  • 图像缩放
            要进行图像处理,我们首先应该添加显示图片,处理图像和创建按钮的头文件。
    其次我们应该说明Qlabel和QImage对象的指针,分别用于显示图像和存储图像,紧接着声明放大按钮和缩小按钮。
            最后,定义一个私有槽,其中声明用于与信号相连接的响应函数。
    (槽分为三类:public slots ; protect slots ; private slots,对应的区别大家可以自行了解)
    代码如下:
     
    #ifndef WIDGET_H
    #define WIDGET_H
    #include <QWidget> //窗口组件
    #include <QLabel> //显示图片
    #include <QImage> //处理图像
    #include <QPushButton> //创建按钮
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    class Widget : public QWidget
    {
    Q_OBJECT
    public:
            Widget(QWidget *parent = nullptr);
            ~Widget();
    private:
            Ui::Widget *ui;
    private:
            QLabel *label;
            QImage *img;
            QPushButton *bigBt; //放大按钮
            QPushButton *smallBt; //缩小按钮
    private slots: //私有槽:只有类自己可以将信号与之相连接
            void bShow(); //放大
            void sShow(); //缩小
    };
    #endif // WIDGET_H
            在widget.cpp中,在构造函数中我们应该实例label、img以及放大按钮和缩小按钮。同时在构造函数外定义放大按钮和缩小按钮的响应函数。具体代码如下:
    #include "widget.h"
    #include "ui_widget.h"
    Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    {
    ui->setupUi(this);
    //实例 QLabel
    label = new QLabel(this);
    label->setGeometry(QRect(160,50,500,500)); //放置控件位置,x,y,宽,高
    //实例QImage
    img = new QImage;
    //QImage加载图片
    img->load("S:/VStudio/image/1.bmp");
    //label显示图片
    label->setPixmap(QPixmap::fromImage(*img)); //QPixmap类是一种图像表示形式,可以用作绘画设备
    //实例放大按钮
    bigBt = new QPushButton(this);
    bigBt->setGeometry(QRect(50,100,100,25)); //设置按钮位置和大小
    bigBt->setText("放大");
    connect(bigBt,SIGNAL(clicked()),this,SLOT(bShow())); //使用connect()函数连接按钮的clicked()信号到窗口的bShow()槽函数
    //表明用户在单机该按钮时,会触发bShow()槽函数执行操作
    //实例缩小按钮
    smallBt = new QPushButton(this);
    smallBt->setGeometry(QRect(50,150,100,25));
    smallBt->setText("缩小");
    connect(smallBt,SIGNAL(clicked()),this,SLOT(sShow()));
    }
    //放大操作
    void Widget::bShow()
    {
    *img = img->scaled(600,600,Qt::IgnoreAspectRatio);
    label->setPixmap(QPixmap::fromImage(*img)); //绘制图像
    }
    //缩小操作
    void Widget::sShow()
    {
    *img = img->scaled(100,100,Qt::IgnoreAspectRatio);
    label->setPixmap(QPixmap::fromImage(*img)); //绘制图像
    }
    Widget::~Widget()
    {
    delete ui;
    }

实现效果:

 

 

 总结:
        在.h需声明按钮和响应函数,在.cpp中实例按钮、定义响应函数。
        按照这样的思路,我们可以再添加移动按钮、垂直翻转按钮、水平翻转按钮、角度翻转按钮、亮度调节按钮、灰度按钮等等
        方法和思路与图像缩小按钮一致,在这里我只提供关键代码:

private:
QLabel *label;
QImage *img;
QPushButton *bigBt; //放大按钮
QPushButton *smallBt; //缩小按钮
QPushButton *move; //移动按钮
QPushButton *Vflip; //垂直翻转按钮
QPushButton *Hflip; //水平翻转按钮
QPushButton *Dflip; //角度翻转按钮
QPushButton *bright; //亮度调节按钮
private slots: //私有槽:只有类自己可以将信号与之相连接
void on_pushButton_clicked();
void bShow(); //放大
void sShow(); //缩小
void moveImg(); //移动
void hshow(); //水平翻转
void vShow(); //垂直翻转
void angleShow(); //角度操作
Widget::Widget(QWidget *parent) //父窗口指针
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//实例 QLabel
label = new QLabel(this);
label->setGeometry(QRect(160,50,500,500)); //放置控件位置,x,y,宽,高
//实例QImage
img = new QImage;
//QImage加载图片
img->load("S:/VStudio/image/1.bmp");
//label显示图片
label->setPixmap(QPixmap::fromImage(*img)); //QPixmap类是一种图像表示形式,可以用作绘画设备
//实例放大按钮
bigBt = new QPushButton(this);
bigBt->setGeometry(QRect(50,100,100,25)); //设置按钮位置和大小
bigBt->setText("放大");
connect(bigBt,SIGNAL(clicked()),this,SLOT(bShow())); //使用connect()函数连接按钮的clicked()信号到窗口的bShow()槽函数
//表明用户在单机该按钮时,会触发bShow()槽函数执行操作
//实例缩小按钮
smallBt = new QPushButton(this);
smallBt->setGeometry(QRect(50,150,100,25));
smallBt->setText("缩小");
connect(smallBt,SIGNAL(clicked()),this,SLOT(sShow()));
//实例移动按钮
move = new QPushButton(this);
move->setGeometry(QRect(50,200,100,25));
move->setText("移动");
connect(move,SIGNAL(clicked()),this,SLOT(moveImg()));
//实例垂直翻转按钮
Vflip = new QPushButton(this);
Vflip->setGeometry(QRect(50,250,100,25));
Vflip->setText("垂直翻转");
connect(Vflip,SIGNAL(clicked()),this,SLOT(vShow()));
//实例水平翻转按钮
Hflip = new QPushButton(this);
Hflip->setGeometry(QRect(50,300,100,25));
Hflip->setText("水平翻转");
connect(Hflip,SIGNAL(clicked()),this,SLOT(hshow()));
//实例角度翻转按钮
Dflip = new QPushButton(this);
Dflip->setGeometry(QRect(50,350,100,25));
Dflip->setText("角度翻转");
connect(Dflip,SIGNAL(clicked()),this,SLOT(angleShow()));
}
//放大操作
void Widget::bShow()
{
*img = img->scaled(600,600,Qt::IgnoreAspectRatio);
label->setPixmap(QPixmap::fromImage(*img)); //绘制图像
}
//缩小操作
void Widget::sShow()
{
*img = img->scaled(100,100,Qt::IgnoreAspectRatio);
label->setPixmap(QPixmap::fromImage(*img)); //绘制图像
}
//点击移动
int i=50;
void Widget::moveImg()
{
//移动label控件
label->move(i,50); //修改控件位置
i+=10; //每次移动10像素
}
//垂直翻转
void Widget::vShow()
{
*img = img->mirrored(false,true); //水平翻转false,垂直翻转true
label->setPixmap(QPixmap::fromImage(*img));
}
//水平翻转
void Widget::hshow()
{
*img = img->mirrored(true,false);
label->setPixmap(QPixmap::fromImage(*img));
}
//角度操作
void Widget::angleShow()
{
QMatrix matrix;
//88度
matrix.rotate(88);
*img = img->transformed(matrix);
label->setPixmap(QPixmap::fromImage(*img));
}

实现效果:

        目前为止,最基础的图像处理已经完成。但是还有许多可以发挥的空间。比如对图像进行灰度和亮度调节,把界面设计的更好看,让图像缩放效果更好等等
如果后期有时间我会继续完善 

posted @   Flying3080  Views(201)  Comments(0Edit  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示