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:以上的思路和代码我均有从网上学习来的,忘记出处,侵删!