这一段时间在做一个图片浏览器,实现图片左右浏览,图片删除,图片旋转的功能,在初期的时候我在window系统下面的QT Creator中编写代码,编写以后实现了以上所说的功能。虽然难度不是很大,但是在编写的时候由于能力有限,也花费了我很多时间,希望这段代码对大家有所帮助
由于ui文件没办法上传,所以只能讲ui文件的.h文件写在这里
ui_csimagescan.h
#include "csimagescan.h"
#include "ui_csimagescan.h"
csImageScan::csImageScan(QWidget *parent) :
QDialog(parent),
ui(new Ui::csImageScan)
{
ui->setupUi(this);
position =0;
left=0;
right=0;
num_Roll = 0;
//为前后翻转按钮,顺时针逆时针旋转按钮和删除按钮添加图标
QPixmap m_pixmap("image/pre.png");//前翻转
QIcon m_icon;
m_icon.addPixmap(m_pixmap);
ui->pre->setIcon(m_icon);
ui->pre->setIconSize(QSize(60,60));
m_pixmap.load("image/next.png");//后翻转
m_icon.addPixmap(m_pixmap);
ui->next->setIcon(m_icon);
ui->next->setIconSize(QSize(60,60));
m_pixmap.load("image/left.png");//逆时针
m_icon.addPixmap(m_pixmap);
ui->rotuteleft->setIcon(m_icon);
ui->rotuteleft->setIconSize(QSize(60,60));
m_pixmap.load("image/right.png");//顺时针
m_icon.addPixmap(m_pixmap);
ui->rotuteright->setIcon(m_icon);
ui->rotuteright->setIconSize(QSize(60,60));
m_pixmap.load("image/imgdelete.png");//删除
m_icon.addPixmap(m_pixmap);
ui->pbdelete->setIcon(m_icon);
ui->pbdelete->setIconSize(QSize(60,60));
}
csImageScan::~csImageScan()
{
delete ui;
}
void csImageScan::on_open_clicked()//打开对话框选择图片
{
position =0;
stringlist.clear();
// printf("%s\n",filepath.toAscii().constData());
filepath = QFileDialog::getOpenFileName(NULL, QObject::tr("Open Image"), ".",
QObject::tr("Image Files(*.jpg *.png)"));
filelist = filepath.split("/");
filelist.removeLast ();
folderpath = filelist.join("/");//打开图片所在的文件夹路径
setpixmap(filepath);
Open_File(folderpath);//遍历文件夹下边的图片类型文件
}
void csImageScan::Open_File(QString path)//遍历文件夹下边的图片类型文件
{
QDirIterator m_DirIterator(path,QDir::Files|QDir::NoSymLinks);
while (m_DirIterator.hasNext())
{
QString tempFile=m_DirIterator.next();
QStringList list=tempFile.split(".");
//list.takeFirst();
//QString expandedName=list.takeFirst();
QString expandedName=list.takeLast();
if(expandedName=="jpg"||expandedName=="JPG"||expandedName=="png"||expandedName=="PNG"||expandedName=="bmp"||expandedName=="BMP")
stringlist<<tempFile;
}
getposition(stringlist);//获得打开图片在stringlist中的位置
}
//获得打开图片在stringlist中的位置
void csImageScan::getposition(QStringList imagelist)
{
//num=0;
QListIterator<QString> it(imagelist);
while(it.hasNext())
{
if(filepath == it.next())
break;
else
position++;
}
}
//上一张图片
void csImageScan::on_pre_clicked()
{
left=0;
right=0;
num_Roll = 0;
if(0 == stringlist.size())
{
printf("get pre image erron \n");
return ;
}
position--;
if(position<0)
{
position=stringlist.size()-1;
}
filepath = stringlist.at(position);
setpixmap(filepath);
}
//下一张图片
void csImageScan::on_next_clicked()
{
left=0;
right=0;
num_Roll = 0;
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
position++;
if(position>stringlist.size()-1)
{
position=0;
}
filepath = stringlist.at(position);
setpixmap(filepath);
}
//逆时针旋转
void csImageScan::on_rotuteleft_clicked()
{
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
left=1;
if(left==1&&right==1)
{
num_Roll--;
QMatrix matrix;
matrix.rotate(-90.0);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
else
{
num_Roll++;
image.load(stringlist.at(position));
QMatrix matrix;
matrix.rotate(-90.0*num_Roll);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
}
//顺时针旋转
void csImageScan::on_rotuteright_clicked()
{
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
right=1;
if(left==1&&right==1)
{
QMatrix matrix;
matrix.rotate(90.0);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
else
{
num_Roll++;
image.load(stringlist.at(position));
QMatrix matrix;
matrix.rotate(90.0*num_Roll);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
}
//删除图片
void csImageScan::on_pbdelete_clicked()
{
if(stringlist.size() == 0)
return;
QMessageBox::StandardButton rb = QMessageBox::question(NULL,"Warning",
"Do you want to delete the picture?",QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if(rb == QMessageBox::Yes)
{
stringlist.takeAt(position);
QDir dir(folderpath);
QFileInfoList fileList;
QFileInfo curFile;
QStringList filters;
filters << "*.jpg"<<"*.png";
fileList=dir.entryInfoList(filters,QDir::Dirs|QDir::Files
|QDir::Readable|QDir::Writable
|QDir::Hidden|QDir::NoDotAndDotDot
,QDir::Name);
if(fileList.size()>0)
{
curFile=fileList[position];
QFile fileTemp(curFile.filePath());
fileTemp.remove();
fileList.removeAt(position);
}
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
filepath = stringlist.at(position);//删除图片以后每张图片的位置就会自动减一,所以仍然加载这个位置的图片就是删除图片的下一张图片
setpixmap(filepath);
}
}
//重绘事件
void csImageScan::paintEvent ( QPaintEvent * )
{
QPainter painter(this);
painter.drawPixmap(20,20,pix);
}
//加载图片
void csImageScan::setpixmap(QString imageName)
{
pix.load(imageName);
update();
}
csimagescan.h
#ifndef CSIMAGESCAN_H
#define CSIMAGESCAN_H
#include <QDialog>
#include <QtGui>
namespace Ui {
class csImageScan;
}
class csImageScan : public QDialog
{
Q_OBJECT
public:
explicit csImageScan(QWidget *parent = 0);
~csImageScan();
public:
QString filepath;//打开图片的路径
QString folderpath;
QStringList filelist;
QStringList stringlist;
QImage image;
QPixmap pix;
int position;//图片在文件夹中的位置
int num_Roll;//旋转次数,通过旋转次数来得到旋转角度
bool left;
bool right;
private:
Ui::csImageScan *ui;
public:
void paintEvent (QPaintEvent * );
void setpixmap(QString );
void Open_File(QString);
void getposition(QStringList);
private slots:
void on_pbdelete_clicked();
void on_rotuteright_clicked();
void on_rotuteleft_clicked();
void on_next_clicked();
void on_pre_clicked();
void on_open_clicked();
};
#endif // CSIMAGESCAN_H
csimagescan.cpp
#include "csimagescan.h"
#include "ui_csimagescan.h"
csImageScan::csImageScan(QWidget *parent) :
QDialog(parent),
ui(new Ui::csImageScan)
{
ui->setupUi(this);
position =0;
left=0;
right=0;
num_Roll = 0;
//为前后翻转按钮,顺时针逆时针旋转按钮和删除按钮添加图标
QPixmap m_pixmap("image/pre.png");//前翻转
QIcon m_icon;
m_icon.addPixmap(m_pixmap);
ui->pre->setIcon(m_icon);
ui->pre->setIconSize(QSize(60,60));
m_pixmap.load("image/next.png");//后翻转
m_icon.addPixmap(m_pixmap);
ui->next->setIcon(m_icon);
ui->next->setIconSize(QSize(60,60));
m_pixmap.load("image/left.png");//逆时针
m_icon.addPixmap(m_pixmap);
ui->rotuteleft->setIcon(m_icon);
ui->rotuteleft->setIconSize(QSize(60,60));
m_pixmap.load("image/right.png");//顺时针
m_icon.addPixmap(m_pixmap);
ui->rotuteright->setIcon(m_icon);
ui->rotuteright->setIconSize(QSize(60,60));
m_pixmap.load("image/imgdelete.png");//删除
m_icon.addPixmap(m_pixmap);
ui->pbdelete->setIcon(m_icon);
ui->pbdelete->setIconSize(QSize(60,60));
}
csImageScan::~csImageScan()
{
delete ui;
}
void csImageScan::on_open_clicked()//打开对话框选择图片
{
position =0;
stringlist.clear();
// printf("%s\n",filepath.toAscii().constData());
filepath = QFileDialog::getOpenFileName(NULL, QObject::tr("Open Image"), ".",
QObject::tr("Image Files(*.jpg *.png)"));
filelist = filepath.split("/");
filelist.removeLast ();
folderpath = filelist.join("/");//打开图片所在的文件夹路径
setpixmap(filepath);
Open_File(folderpath);//遍历文件夹下边的图片类型文件
}
void csImageScan::Open_File(QString path)//遍历文件夹下边的图片类型文件
{
QDirIterator m_DirIterator(path,QDir::Files|QDir::NoSymLinks);
while (m_DirIterator.hasNext())
{
QString tempFile=m_DirIterator.next();
QStringList list=tempFile.split(".");
//list.takeFirst();
//QString expandedName=list.takeFirst();
QString expandedName=list.takeLast();
if(expandedName=="jpg"||expandedName=="JPG"||expandedName=="png"||expandedName=="PNG"||expandedName=="bmp"||expandedName=="BMP")
stringlist<<tempFile;
}
getposition(stringlist);//获得打开图片在stringlist中的位置
}
//获得打开图片在stringlist中的位置
void csImageScan::getposition(QStringList imagelist)
{
//num=0;
QListIterator<QString> it(imagelist);
while(it.hasNext())
{
if(filepath == it.next())
break;
else
position++;
}
}
//上一张图片
void csImageScan::on_pre_clicked()
{
left=0;
right=0;
num_Roll = 0;
if(0 == stringlist.size())
{
printf("get pre image erron \n");
return ;
}
position--;
if(position<0)
{
position=stringlist.size()-1;
}
filepath = stringlist.at(position);
setpixmap(filepath);
}
//下一张图片
void csImageScan::on_next_clicked()
{
left=0;
right=0;
num_Roll = 0;
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
position++;
if(position>stringlist.size()-1)
{
position=0;
}
filepath = stringlist.at(position);
setpixmap(filepath);
}
//逆时针旋转
void csImageScan::on_rotuteleft_clicked()
{
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
left=1;
if(left==1&&right==1)
{
num_Roll--;
QMatrix matrix;
matrix.rotate(-90.0);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
else
{
num_Roll++;
image.load(stringlist.at(position));
QMatrix matrix;
matrix.rotate(-90.0*num_Roll);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
}
//顺时针旋转
void csImageScan::on_rotuteright_clicked()
{
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
right=1;
if(left==1&&right==1)
{
QMatrix matrix;
matrix.rotate(90.0);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
else
{
num_Roll++;
image.load(stringlist.at(position));
QMatrix matrix;
matrix.rotate(90.0*num_Roll);
image = image.transformed(matrix,Qt::FastTransformation);
pix = pix.fromImage(image);
update();
}
}
//删除图片
void csImageScan::on_pbdelete_clicked()
{
if(stringlist.size() == 0)
return;
QMessageBox::StandardButton rb = QMessageBox::question(NULL,"Warning",
"Do you want to delete the picture?",QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if(rb == QMessageBox::Yes)
{
stringlist.takeAt(position);
QDir dir(folderpath);
QFileInfoList fileList;
QFileInfo curFile;
QStringList filters;
filters << "*.jpg"<<"*.png";
fileList=dir.entryInfoList(filters,QDir::Dirs|QDir::Files
|QDir::Readable|QDir::Writable
|QDir::Hidden|QDir::NoDotAndDotDot
,QDir::Name);
if(fileList.size()>0)
{
curFile=fileList[position];
QFile fileTemp(curFile.filePath());
fileTemp.remove();
fileList.removeAt(position);
}
if(0 == stringlist.size())
{
printf("get next image erron \n");
return ;
}
filepath = stringlist.at(position);//删除图片以后每张图片的位置就会自动减一,所以仍然加载这个位置的图片就是删除图片的下一张图片
setpixmap(filepath);
}
}
//重绘事件
void csImageScan::paintEvent ( QPaintEvent * )
{
QPainter painter(this);
painter.drawPixmap(20,20,pix);
}
//加载图片
void csImageScan::setpixmap(QString imageName)
{
pix.load(imageName);
update();
}