Qt--电子相册

11 篇文章 1 订阅

一、功能介绍

能实现上一张,下一张
能实现放大,缩小
能实现左旋转和右旋转

二、代码

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();
}

三、运行

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值