一、功能介绍
能实现上一张,下一张
能实现放大,缩小
能实现左旋转和右旋转
二、代码
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QListWidget>
#include <QFileDialog>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
/* 属性 */
QLabel *Photolabel; // 用来显示一张图片
QTimer *timer; //用来设置定时器
QPixmap pix; //用来设置图片的属性
QStringList fileNames; // 图片文件路径列表
QListWidget *PhotoListView; // 图片列表
QFileDialog *photofileDialog; // 文件对话框
int CurrentPhotoIndex; // 当前显示照片的下标
QPushButton *btnPrevious; // 上一张
QPushButton *btnNext; // 下一张
QPushButton *btnEnlarge; // 放大
QPushButton *btnNarrow; // 缩小
float ScalingFactor; // 缩放系数
QPushButton *btnLeftRotate; // 向左旋转
QPushButton *btnRightRotate; // 向右旋转
int RotateFactor; // 旋转系数
/* 函数 */
public:
void InitWidget(); // 初始化窗口
void loadPhotoList(); // 加载图片列表
void ShowImage(); // 显示单张图片
void SelectPhotoFile(bool bauto); // 选择图片文件 true:自动加载
protected:
//void mousePressEvent(QMouseEvent *event); // 鼠标点击事件
/* 槽函数 */
private slots:
void SltBtnPreviousClicked(); // 上一张槽函数
void SltBtnNextClicked(); // 下一张槽函数
void SltBtnEnlargeClicked(); // 放大
void SltBtnNarrowClicked(); // 缩小
void SltBtnLeftRotateClicked(); // 向左旋转
void SltBtnRightRotateClicked(); // 向右旋转
void SltPhotoListClicked(QListWidgetItem*); //图片列表点击槽函数
};
#endif // WIDGET_H
widget,cpp
#include "widget.h"
#include <QStandardItemModel>
#include <QDebug>
#include <QDir>
#include <QListWidget>
#include <QMessageBox>
#include <QMouseEvent>
#include <QMatrix>
// /* 获取应用程序当前工作目录的绝对路径 */
// QString currentPath;
// QDir dir;
// currentPath = dir.currentPath();
// qDebug() << "currentPath = " << currentPath;
// QString absolutePath = dir.absolutePath();
// qDebug() << "absolutePath = " << absolutePath;
QString path = "/home/luatao/qt/Photos/images/";
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
CurrentPhotoIndex = 0; // 当前显示照片下标为0
ScalingFactor = 1; // 默认不缩放
RotateFactor = 0; // 旋转系数
InitWidget(); // 初始化窗口
SelectPhotoFile(true); // 获取图片列表
loadPhotoList(); // 加载图片列表
ShowImage(); // 默认显示第一张图片
// timer = new QTimer(this);
// connect(timer,SIGNAL(timeout()),this,SLOT(imageshow()));
}
Widget::~Widget()
{
}
void Widget::InitWidget()
{
this->setGeometry(0,0,800,480); // 窗口的大小
this->setStyleSheet("color:green;background-color:rgb(0,0,0);");
/* 初始化label */
Photolabel = new QLabel(this);
// Photolabel->setAlignment(Qt::AlignCenter); // 居中显示
//Photolabel->resize(800,400); // 显示的图片的大小
Photolabel->setGeometry(100,0,600,400);
Photolabel->setStyleSheet("color:green;background-color:rgb(200,200,200);");
/* 上一张 和下一张 */
btnPrevious = new QPushButton("上一张",this);
btnPrevious->setGeometry(20,50,50,50);
btnNext = new QPushButton("下一张",this);
btnNext->setGeometry(800 - 20 - 50,50,50,50);
/* 按键绑定函数 */
connect(btnPrevious, SIGNAL(clicked()),this, SLOT(SltBtnPreviousClicked()));
connect(btnNext, SIGNAL(clicked()),this, SLOT(SltBtnNextClicked()));
/* 放大和缩小*/
btnEnlarge = new QPushButton("放大",this);
btnEnlarge->setGeometry(20,150,50,50);
btnNarrow = new QPushButton("缩小",this);
btnNarrow->setGeometry(800 - 20 - 50,150,50,50);
/* 按键绑定函数 */
connect(btnEnlarge, SIGNAL(clicked()),this, SLOT(SltBtnEnlargeClicked()));
connect(btnNarrow, SIGNAL(clicked()),this, SLOT(SltBtnNarrowClicked()));
/* 旋转 */
btnLeftRotate = new QPushButton("左旋转",this);
btnLeftRotate->setGeometry(20,250,50,50);
btnRightRotate = new QPushButton("右旋转",this);
btnRightRotate->setGeometry(800 - 20 - 50,250,50,50);
/* 按键绑定函数 */
connect(btnLeftRotate, SIGNAL(clicked()),this, SLOT(SltBtnLeftRotateClicked()));
connect(btnRightRotate, SIGNAL(clicked()),this, SLOT(SltBtnRightRotateClicked()));
/* 图片列表 实现缩略图效果 */
//定义QListWidget对象
PhotoListView = new QListWidget(this);
PhotoListView->setStyleSheet("color:green;background-color:rgb(100,100,100);");
//PhotoListView->resize(800,400);
PhotoListView->setGeometry(0,400,800,80); // 位置和大小
//设置QListWidget的显示模式
PhotoListView->setViewMode(QListView::IconMode); // 显示为图标显示
//设置QListWidget中单元项的图片大小
PhotoListView->setIconSize(QSize(60,60)); // 设置图标的大小
//设置QListWidget中单元项的间距
PhotoListView->setSpacing(5);
//设置自动适应布局调整(Adjust适应,Fixed不适应),默认不适应
PhotoListView->setResizeMode(QListWidget::Adjust);
//设置不能移动
PhotoListView->setMovement(QListWidget::Static);
/* 绑定PhotoListView触发槽函数 */
connect(PhotoListView, SIGNAL(itemClicked(QListWidgetItem*)),this, SLOT(SltPhotoListClicked(QListWidgetItem*)));
}
void Widget::loadPhotoList()
{
for(auto tmp : fileNames)
{
//定义QListWidgetItem对象
QListWidgetItem *imageItem = new QListWidgetItem;
//为单元项设置属性
imageItem->setIcon(QIcon(tmp));
//imageItem->setText(tr("Browse"));
//重新设置单元项图片的宽度和高度
//imageItem->setSizeHint(QSize(60,60));
//将单元项添加到QListWidget中
PhotoListView->addItem(imageItem);
}
//显示QListWidget
PhotoListView->show();
}
void Widget::SelectPhotoFile(bool bauto)
{
if(bauto == false){ // 手动加载
/* 定义文件对话框类 */
photofileDialog = new QFileDialog(this); // 文件对话框
/* 定义文件对话框标题 */
photofileDialog->setWindowTitle(tr("打开图片"));
/* 设置默认文件路径 */
photofileDialog->setDirectory(path);
/* 设置文件过滤器 */
photofileDialog->setNameFilter(tr("Images(*.png *.jpg *.jpeg *.bmp)"));
/* 设置可以选择多个文件,默认为只能选择一个文件QphotofileDialog::ExistingFiles */
photofileDialog->setFileMode(QFileDialog::ExistingFiles);
/* 设置视图模式 */
photofileDialog->setViewMode(QFileDialog::Detail);
//打印所有选择的文件的路径
if(photofileDialog->exec())
{
fileNames = photofileDialog->selectedFiles();
//showImageList();
}
}else{ // 自动加载
QDir dir(path); // 获取目录文件夹
if(!dir.exists()){ // 目录不存在
QMessageBox::information(this,"提示信息","目录不存在");
return;
}
dir.setFilter(QDir::Files|QDir::NoSymLinks);
/* 设置文件过滤器 */
QStringList filters;
filters << "*.png" << "*.jpg" << "*.jpeg" << "*.bmp"; //
dir.setNameFilters(filters);
/* 判断过滤之后文件个数 */
int dir_cout = dir.count();
qDebug()<<dir_cout<<endl; // 输出文件的个数
if(dir_cout<=0)
return;
/* 获取图片路径 */
for(int i=0;i<dir_cout;i++){
fileNames << path + dir[i]; // 获取图片路径 添加到图片列表
}
}
/* 打印选择的文件名 */
//for(auto tmp:fileNames)
// qDebug()<<tmp<<endl;
}
/**
* @brief Widget::ShowImage
* 显示图片
*/
void Widget::ShowImage()
{
/* 显示图片在label中 */
// qDebug() << fileNames.at(index) <<endl;
pix.load(fileNames.at(CurrentPhotoIndex)); // 显示一张图片
QMatrix matrix;
matrix.rotate(RotateFactor);
pix = pix.transformed(matrix,Qt::FastTransformation);
// pix = pix.scaled(Photolabel->width(),Photolabel->height(),Qt::KeepAspectRatio); // 按比例缩放
pix = pix.scaled(Photolabel->width() * ScalingFactor,Photolabel->height() * ScalingFactor,Qt::KeepAspectRatio); // 按比例缩放
Photolabel->setPixmap(pix);
Photolabel->setAlignment(Qt::AlignCenter); // 居中显示
}
/**
* @brief SltPhotoListClicked
* 图片列表点击槽函数
*/
void Widget::SltPhotoListClicked(QListWidgetItem* item)
{
qDebug()<< "SltPhotoListClicked" << endl;
/* 如果需要单独操作某一项 */
// if(PhotoListView->item(0) == item){ // 这是第一项
// qDebug()<< "SltPhotoListClickedaaa" << endl;
// }
/* 这里不需要,直接操作全部 */
int index = PhotoListView->row(item); // 获取这一项的行号
// qDebug() << PhotoListView->row(item) << endl;
CurrentPhotoIndex = index;
ShowImage(); // 显示一张图片
}
/**
* @brief SltBtnPreviousClicked
* 上一张按键点击
*/
void Widget::SltBtnPreviousClicked()
{
// qDebug() << "SltBtnPreviousClicked" <<endl;
ScalingFactor = 1; // 默认大小
RotateFactor = 0; // 默认角度为0
CurrentPhotoIndex --;
if(CurrentPhotoIndex < 0){
CurrentPhotoIndex = 0;// 显示第一张
QMessageBox::information(this,"提示","已经是第一张");
}
ShowImage(); // 显示照片
}
/**
* @brief SltBtnNextClicked
* 下一张按键点击
*/
void Widget::SltBtnNextClicked()
{
// qDebug() << "SltBtnNextClicked" <<endl;
ScalingFactor = 1; // 默认大小
RotateFactor = 0; // 默认角度为0
CurrentPhotoIndex ++;
// qDebug() << PhotoListView->count()<<endl;
if(CurrentPhotoIndex >= PhotoListView->count()){
CurrentPhotoIndex = PhotoListView->count() - 1;// 显示最后一张
QMessageBox::information(this,"提示","已经是最后一张");
}
ShowImage(); // 显示照片
}
/**
* @brief Widget::SltBtnEnlargeClicked
* 放大
*/
void Widget::SltBtnEnlargeClicked()
{
// qDebug() << "SltBtnEnlargeClicked" <<endl;
ScalingFactor += 0.2;
if(ScalingFactor > 1.4){
ScalingFactor = 1.4; // 最大为1.4倍
}
// pix = pix.scaled(Photolabel->width() * ScalingFactor,Photolabel->height() * ScalingFactor,Qt::KeepAspectRatio); // 按比例缩放
// Photolabel->setPixmap(pix);
ShowImage();
}
/**
* @brief Widget::SltBtnNarrowClicked
* 缩小
*/
void Widget::SltBtnNarrowClicked()
{
//qDebug() << "SltBtnNarrowClicked" <<endl;
ScalingFactor -= 0.2;
if(ScalingFactor < 0.4){
ScalingFactor = 0.4; // 最小为0.4
}
// pix = pix.scaled(Photolabel->width() * ScalingFactor,Photolabel->height() * ScalingFactor,Qt::KeepAspectRatio); // 按比例缩放
// Photolabel->setPixmap(pix);
ShowImage();
}
/**
* @brief Widget::SltBtnLeftRotateClicked
* 向左旋转
*/
void Widget::SltBtnLeftRotateClicked()
{
RotateFactor -= 90;
ShowImage();
}
/**
* @brief Widget::SltBtnRightRotateClicked
* 向右旋转
*/
void Widget::SltBtnRightRotateClicked()
{
RotateFactor += 90;
ShowImage();
//if(RotateFactor == );
// Photolabel->setPixmap(pix);
}
///* 鼠标点击事件 */
//void Widget::mousePressEvent(QMouseEvent *e)
//{
PhotoListView->item(0)
// qDebug()<<"mousePressEvent clicked" <<endl;
if (btnHome->rect().contains(e->pos())) { // 是按键按下的区域;
btnHome->setPressed(true); // 按键按下
this->update();
}
//}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
三、运行