Qt学习之始

Qt学习之始

从三月份开始接触Qt,刚开始是想为了完成C++老师布置的作业,开发一个图像处理的小程序。

于是就开始学习Qt,接触的是Qt5.5.1。Qt从5.0版本开始添加了许多特性。由于完全小白,就没去折腾其他的编译环境了。就用了QtCreater来学习Qt的开发。刚开始完全按照视频的教程,傻瓜式的跟着打代码,先打再慢慢理解。跟着打了几个小小的项目后,对Qt有了个大概的了解。于是就开始可以看的懂网上的文字教程描述了。后来也是在网上查的各种资料完成了作业——一个千疮百孔的图像处理软件。此处上图,哈哈

界面特别土,基本没有什么UI设计。用Label实现简单的图片显示,然后实现了图片的缩放,旋转,垂直和横向扭曲。不得不说,扭曲真的和shi一样啊。

此处贴上代码,坚持开源学习精神。哈哈哈  其实这么烂的代码,开源别人也不屑的吧。我不,我就是要开源生气,我也是网上看的开源代码学习来的

<span style="font-family:Microsoft YaHei;font-size:18px;">#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QImage>
#include <QFileDialog>
#include <QString>
#include <QPixmap>
#include <QLabel>
#include <QPainter>
#include <QMessageBox>
#include <QMatrix>
#include <QSlider>
#include <QDebug>
#include <QStandardPaths>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
      QImage *imageR;//=NULL;
      QImage *image3;
      QImage *image4;
      QImage *imageInit;
      QString fileName;
      //=NULL;

private:
    Ui::MainWindow *ui;
    QImage *image;
    QImage *imageS;

private slots:
    void openImageSlot();
    void zoomImageSlot();
    void spinImageSlot();
    void shearHImageSlot();
    void shearLImageSlot();
    void restoreImageSlot();
    void saveImageSlot();
    void aboutSLot();
    void quitSlot();
};

#endif // MAINWINDOW_H</span>


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "about.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("图像处理");
    //----------相关信号与槽的连接-----------------------
    this->connect(ui->openImageButton,SIGNAL(clicked(bool)),this,SLOT(openImageSlot()));
    this->connect(ui->openAction,SIGNAL(triggered(bool)),this,SLOT(openImageSlot()));
    this->connect(ui->aboutAction,SIGNAL(triggered(bool)),this,SLOT(aboutSLot()));
    this->connect(ui->saveAction,SIGNAL(triggered(bool)),this,SLOT(saveImageSlot()));
    this->connect(ui->quitAction,SIGNAL(triggered(bool)),this,SLOT(quitSlot()));
   // this->connect(ui->zoomImageButton,SIGNAL(clicked(bool)),this,SLOT(zoomImageSlot()));
    //this->connect(ui->spinImageButton,SIGNAL(clicked(bool)),this,SLOT(spinImageSlot()));

    //-------缩放的slider-------------
    ui->zoomSlider->setRange(1,100);
    ui->zoomSlider->setValue(10);
    //-------旋转的slider--------------
    ui->rotateSlider->setRange(-360,360);
    ui->rotateSlider->setValue(0);
    //-------横向扭曲的slider-----------
    ui->shearHSlider->setRange(-10,10);
    ui->shearHSlider->setValue(0);
    //-------垂直扭曲的slider----------
    ui->shearLSlider->setRange(-10,10);
    ui->shearLSlider->setValue(0);
    //-------初始化-----------
    this->imageS=new QImage;
    this->imageR=new QImage;
    this->image3=new QImage;
    this->image4=new QImage;
    this->imageInit=new QImage;
    this->image=new QImage;
}

MainWindow::~MainWindow()
{
    delete ui;
}
int flag=0;
//-------打开图片------------
void MainWindow::openImageSlot()
{

    fileName = QFileDialog::getOpenFileName(this,"选择图像",QString(),"image(*.png;*.jpg;*.bmp)");
    if(fileName.isEmpty())
    {
        return;
    }
    else
    {
        image = new QImage;
        if(!(image->load(fileName)))
        {
            QMessageBox::information(this,tr("打开图片失败"),tr("打开图片失败!"));
            return;
        }
        //*image=image->scaled(ui->showImageLabel->size(),Qt::KeepAspectRatio);
        ui->showImageLabel->setPixmap(QPixmap::fromImage(*image));
        //imageInit=image;
    }
    flag=0;
    //--------打开图片后,建立信号与槽的连接-------------------
    this->connect(ui->zoomSlider,SIGNAL(valueChanged(int)),this,SLOT(zoomImageSlot()));
    this->connect(ui->rotateSlider,SIGNAL(valueChanged(int)),this,SLOT(spinImageSlot()));
    this->connect(ui->shearHSlider,SIGNAL(valueChanged(int)),this,SLOT(shearHImageSlot()));
    this->connect(ui->shearLSlider,SIGNAL(valueChanged(int)),this,SLOT(shearLImageSlot()));
    this->connect(ui->restoreButton,SIGNAL(clicked(bool)),this,SLOT(restoreImageSlot()));
    this->connect(ui->saveButoon,SIGNAL(clicked(bool)),this,SLOT(saveImageSlot()));

}
//-------------缩放-------------
void MainWindow::zoomImageSlot()
{


    QImage *imageScaled=new QImage;

    if(flag==2)
        *image=*imageR;
    else if(flag==3)
        *image=*image3;
    else if(flag==4)
        *image=*image4;
    if(flag==5)
        *image=*imageInit;
    //取出图片的长宽
    int height=image->height();
    int width=image->width();
    //取出滑条的值
    int zoomValue=ui->zoomSlider->value();
    *imageScaled=image->scaled(width*10/zoomValue,height*10/zoomValue,Qt::KeepAspectRatio);
    ui->showImageLabel->setPixmap(QPixmap::fromImage(*imageScaled));
    *imageS=*imageScaled;
    delete imageScaled;
    flag=1;
}
<span style="font-family:Microsoft YaHei;">//</span>------------旋转---------------
void MainWindow::spinImageSlot()
{
    QImage *imageRatate=new QImage;
    if(flag==1)
        *image=*imageS;
    else if(flag==3)
        *image=*image3;
    else if(flag==4)
        *image=*image4;
    if(flag==5)
        *image=*imageInit;
    QMatrix matrix;

   // matrix.translate(image->width(),0);
  //  *imageRatate=image->transformed(matrix);
    matrix.rotate(ui->rotateSlider->value());
    *imageRatate=image->transformed(matrix);
    ui->showImageLabel->setPixmap(QPixmap::fromImage(*imageRatate));
    *imageR=*imageRatate;
    delete imageRatate;
    flag=2;
}
//------------横向扭曲------------
void MainWindow::shearHImageSlot()
{
    QImage *imageShear=new QImage;
    if(flag==2)
        *image=*imageR;
    else if(flag==1)
        *image=*imageS;
    else if(flag==4)
        *image=*image4;
    if(flag==5)
        *image=*imageInit;
    QMatrix matrix;
    matrix.shear(ui->shearHSlider->value(),0);
    *imageShear=image->transformed(matrix);
    ui->showImageLabel->setPixmap(QPixmap::fromImage(*imageShear));
    *image3=*imageShear;
    delete imageShear;
    flag=3;

}
//-------------垂直扭曲----------------
void MainWindow::shearLImageSlot()
{
    QImage *imageShear=new QImage;
    if(flag==2)
        *image=*imageR;
    else if(flag==3)
        *image=*image3;
    else if(flag==1)
        *image=*imageS;
    if(flag==5)
        *image=*imageInit;
    QMatrix matrix;
    matrix.shear(0,ui->shearLSlider->value());
    *imageShear=image->transformed(matrix);
    ui->showImageLabel->setPixmap(QPixmap::fromImage(*imageShear));
    *image4=*imageShear;
    delete imageShear;
    flag=4;
}

void MainWindow::restoreImageSlot()
{
    imageInit->load(fileName);
    ui->showImageLabel->setPixmap(QPixmap::fromImage(*imageInit));
    //-------缩放的slider-------------
    ui->zoomSlider->setRange(1,100);
    ui->zoomSlider->setValue(10);
    //-------旋转的slider--------------
    ui->rotateSlider->setRange(-360,360);
    ui->rotateSlider->setValue(0);
    //-------横向扭曲的slider-----------
    ui->shearHSlider->setRange(-10,10);
    ui->shearHSlider->setValue(0);
    //-------垂直扭曲的slider----------
    ui->shearLSlider->setRange(-10,10);
    ui->shearLSlider->setValue(0);
    flag=5;
}

void MainWindow::saveImageSlot()
{

    QString fileName=QFileDialog::getSaveFileName(this,"保存图片",
             QStandardPaths::writableLocation(QStandardPaths::PicturesLocation),tr("Images (*.png;*.bmp;*.jpg)"));
    //this->image.save(fileName);//保存
    switch(flag)
    {
    case 1:
        this->imageS->save(fileName);
        break;
    case 2:
        this->imageR->save(fileName);
        break;
    case 3:
        this->image3->save(fileName);
        break;
    case 4:
        this->image4->save(fileName);
        break;
    default:break;
    }

}

void MainWindow::aboutSLot()
{
    About *about=new About;
    about->setWindowTitle("关于软件");
    about->show();
}

void MainWindow::quitSlot()
{
    this->close();
}

学习之路漫漫其修远兮,慢慢来。

PS:以上的思路和代码我均有从网上学习来的,忘记出处,侵删!

附件下载:源程序    可执行程序

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值