QT实战之实现图片浏览系统

目录
  • 引言
  • 实现功能
  • 效果
  • 实现图片浏览所用知识
  • 实现流程
  • 实现环境和UI设计
  • 具体实现

引言

本系统支持,自动播放,左右拖动切换,点击列表切换,点击按钮切换;是一个标准的图像浏览软件。

Windows 图片浏览器,可以查看当前文件夹下的图片,往上翻、往下翻并且自动播放;

此系统增加一个列表;

实现功能

1.浏览电脑里的文件夹,将当前文件夹下的图片列表罗列出来;

2.鼠标点击列表上的某一张图片,图片将显示出来;

3.可以控制浏览当前图片的上一张和下一张;

4.实现鼠标拖动图片,左划,右划切换图片;

5.实现自动播放的开始和停止控制。

效果

实现图片浏览所用知识

包括窗口部件、布局、事件、对象模型与容器类、图形视图、模型/视图编程以及多线程等。

实现流程

1.定义一个图片类,该类包含图片的路径、文件名、文件id以及获取这些变量的函数。

2. 主要包含添加图像以及获取所有图像以及新加入图像的函数。

3.最后通过将图片名字加入到界面左侧QDockWidget部件中的QTreeView中,

4.通过双击可查看完整图片,以及通过滚轮和鼠标等事件来对图片进行一些操作。

实现环境和UI设计

环境:VS2017 + Qt5.12.4

具体实现

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QListWidget>
#include <QMainWindow>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_btnOpen_clicked();

    void on_listWidget_itemClicked(QListWidgetItem *item);

    void MyFunction();
    void on_pushButton_clicked();

    void on_btnLast_clicked();

    void on_btnNext_clicked();

protected:
    bool eventFilter(QObject *watch, QEvent *evn);

    QStringList getFileNames(const QString &path);
private:
    Ui::MainWindow *ui;

    QVector<QString> mListPath;
    QTimer mTimer;
    int index ;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileInfoList>
#include <QString>
#include <QDir>
#include <QMessageBox>
#include <QImage>
#include "qevent.h"
#include <QDebug>
#pragma execution_character_set("utf-8")
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    index =0;
    mTimer.setInterval(1000);
    connect(&mTimer,SIGNAL(timeout()),this,SLOT(MyFunction()));
    on_btnOpen_clicked();
    mTimer.start(1000);
    ui->btnOpen->setVisible(false);
   // ui->pushButton->setVisible(false);
    this->installEventFilter(this);

    this->setWindowTitle("图片浏览器");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::MyFunction()
{
    if (index == 5) {
        index = 0;
    } else {
        index++;
    }
    if (index == 5) {
        index = 0;
    }

    // this->setStyleSheet(QString("background-image: url(:/%1.png);").arg(index));
     QString strIndex = mListPath.at(index);

      qDebug()<<"index "<<QString::number(index)<<"strIndex "<<strIndex;
      QDir filePath(ui->inputDirPath->text());

    QString fullName = filePath.absoluteFilePath(strIndex);
    QImage img(fullName);
    QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
    ui->label->setPixmap(QPixmap::fromImage(thumb));
}
void MainWindow::on_btnOpen_clicked()
{

   QString filePath = QCoreApplication::applicationDirPath()+"/pic";
   ui->inputDirPath->setText(filePath);
  // QMessageBox::information(this,"提示!",filePath);
    QDir dir(filePath);
    // 判断文件夹是否存在
    if(dir.exists()){
        ui->listWidget->clear();
        QFileInfoList info_list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
        for(int i =0;i<info_list.count();i++){
            ui->listWidget->addItem(info_list.at(i).fileName());

            mListPath.push_back(info_list.at(i).fileName());
        }

    }
    else{
        QMessageBox::information(this,"提示!","文件夹不存在");
    }

}
QStringList MainWindow::getFileNames(const QString &path)
{
    QDir dir(path);
    QStringList nameFilters;
    nameFilters << "*.jpg" << "*.png";
    QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
    return files;
}
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
    if(mTimer.isActive())
      mTimer.stop();
    QDir filePath(ui->inputDirPath->text());

    QString fullName = filePath.absoluteFilePath(item->text());
    QImage img(fullName);
    QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
    ui->label->setPixmap(QPixmap::fromImage(thumb));

}
//点击事件函数
bool MainWindow::eventFilter(QObject *watch, QEvent *evn)
{
    static int press_x;     //点击鼠标时获取的横坐标x
    static int press_y;     //点击鼠标时获取的纵坐标y
    static int relea_x;     //松开鼠标时获取的横坐标x
    static int relea_y;     //松开鼠标时获取的纵坐标y

    QMouseEvent *event = static_cast<QMouseEvent *>(evn);       //将图片QT QEvent 转换为 QMouseEvent ,QKeyEvent....等子类
    //获取点击鼠标(手指)时的坐标
    if (event->type() == QEvent::MouseButtonPress)
    {
            press_x = event->globalX();
            press_y = event->globalY();
    }
    //获取松开鼠标(手指)时的坐标
    if(event->type() == QEvent::MouseButtonRelease)
    {
        relea_x = event->globalX();
        relea_y = event->globalY();

    }
    //对鼠标(手指)滑动的方向进行判断(右滑)
    if((relea_x - press_x) > 5 && event->type() == QEvent::MouseButtonRelease && qAbs(relea_y - press_y) < 50)
    {
       on_btnNext_clicked();
    }
if( event->type() == QEvent::MouseButtonRelease)
     qDebug()<<"releax "<<QString::number(press_x - relea_x)<<"releay "<<QString::number(relea_y - press_y);
    //对鼠标(手指)滑动的方向进行判断(左滑)
    if((press_x - relea_x) > 5 && event->type() == QEvent::MouseButtonRelease && qAbs(relea_y - press_y) < 50)
    {
       on_btnLast_clicked();
    }

    return QWidget::eventFilter(watch, evn);
}

void MainWindow::on_pushButton_clicked()
{
    if(ui->pushButton->text()=="滑动切换")
    {
        ui->pushButton->setText("自动播放");
        if(mTimer.isActive())
          mTimer.stop();
    }
    else
    {
        ui->pushButton->setText("滑动切换");
        if(!mTimer.isActive())
          mTimer.start();
    }
}

void MainWindow::on_btnLast_clicked()
{
    if(index == -1)
    {
        index = 4;
    }
    else
    {
        index--;
    }

    if(index == -1)
    {
        index = 4;
    }
  //  this->setStyleSheet(QString("background-image: url(:/%1.png);").arg(index));
    QString strIndex = mListPath.at(index);

     qDebug()<<"index 111"<<QString::number(index)<<"strIndex "<<strIndex;
     QDir filePath(ui->inputDirPath->text());

     QString fullName = filePath.absoluteFilePath(strIndex);
    QImage img(fullName);
    QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
    ui->label->setPixmap(QPixmap::fromImage(thumb));
}

void MainWindow::on_btnNext_clicked()
{
    if (index == 5) {
        index = 0;
    } else {
        index++;
    }
    if (index == 5) {
        index = 0;
    }

    // this->setStyleSheet(QString("background-image: url(:/%1.png);").arg(index));        //切换图片
     QString strIndex = mListPath.at(index);

      qDebug()<<"index "<<QString::number(index)<<"strIndex "<<strIndex;
      QDir filePath(ui->inputDirPath->text());

      QString fullName = filePath.absoluteFilePath(strIndex);
    QImage img(fullName);
    QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
    ui->label->setPixmap(QPixmap::fromImage(thumb));
}

到此这篇关于QT实战之实现图片浏览系统的文章就介绍到这了,更多相关QT图片浏览系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于Qt实现SVG图片浏览器

    目录 介绍 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 .pro文件 4.2 添加SvgWindow类 4.3 添加SvgWidget类 4.4 svgwidget.h头文件 4.5 svgwidget.cpp源文件 4.6 svgwindow.h头文件 4.7 svgwindow.cpp源文件 4.8 mainwindow.h头文件 4.9 mainwindow.cpp源文件 五.效果演示 介绍 SVG的英文全称是Scalable Vector Graphics,

  • Qt实战之实现图片浏览器

    目录 图片浏览器逻辑 效果图 具体实现 utils.h image.h image_group.h image_group.cpp qimgviewwidget.h qimgviewwidget.cpp main.cpp 图片浏览器逻辑 实现图片浏览器用到了前面几乎所有的知识,包括窗口部件.布局.事件.对象模型与容器类.图形视图.模型/视图编程以及多线程等.大致流程为:首先定义一个图片类,该类包含图片的路径.文件名.文件id以及获取这些变量的函数.然后定义了一个图片数组类,主要包含添加图像以及获

  • QT实战之实现图片浏览系统

    目录 引言 实现功能 效果 实现图片浏览所用知识 实现流程 实现环境和UI设计 具体实现 引言 本系统支持,自动播放,左右拖动切换,点击列表切换,点击按钮切换:是一个标准的图像浏览软件. Windows 图片浏览器,可以查看当前文件夹下的图片,往上翻.往下翻并且自动播放: 此系统增加一个列表: 实现功能 1.浏览电脑里的文件夹,将当前文件夹下的图片列表罗列出来: 2.鼠标点击列表上的某一张图片,图片将显示出来: 3.可以控制浏览当前图片的上一张和下一张: 4.实现鼠标拖动图片,左划,右划切换图片

  • QT实战之打开最近图片功能的实现

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用Qt和QSettings实现打开最近图片功能. 二.项目基本配置 新建一个Qt案例,项目名称为“RecentPhotoTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 mainwindow.h头文件 头文件中

  • Java实战宠物医院预约挂号系统的实现流程

    一.项目简述 功能包括: 用户分为宠物,医生,管理员,宠物主人可进行注册选择医生挂号,选择日期,选择号源,医生可进行宠物接诊,管理员可对宠物,医生信息的维护等等功能. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: JSP +Spring + SpringBoot + MyBatis + html+ css + JavaScript + JQuery +

  • Java毕业设计实战之在线网盘系统的实现

    一.项目简述 功能:用户的邮箱注册.验证码验证以及用户登录. 不需要注册账号,也可以上传满足条件的临时文件,但是只4小时内有效. 文件的管理,上传.下载.重命名.删除.查看统计数据.分类管理等. 文件夹的管理,创建.删除.重命名. 文件的分享,支持通过链接和二维码的分享方式等等,以及管理员对用户的管理等等. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术:

  • Java毕业设计实战之二手书商城系统的实现

    一.项目简述 功能: 主页显示商品: 所有二手书商品展示,可进行商品搜索: 点击商品进入商品详情页,具有立即购买和加入购物车功能,可增减购买商品数量亦可手动输入,热销商品展示. 立即购买进入确认订单页面,可选择已经添加的地址,亦可新增地址. 可选择购买哪些商品,可删除不需要的商品. 点击结算进入确认订单页面,确认后提交订单.后台管理:(修改密码等),商品管理(商品批量添加.上下架等),订单管理. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(

  • Qt实战案例之如何利用QProcess类实现启动进程

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 4.1widget.h头文件 4.2widget.cpp源文件 五.效果演示 Qt提供了一个QProcess类用于启动外部程序并与之通信,启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可. 一.项目介绍 利用QProcess类实现启动进程的功能(以记事本程序为例). 二.项目基本配置 新建一个Qt案例,项目名称为“ProcessTest”,基类选择“QWidget”,点击选中创建UI界面复选框,

  • Java实战之仿天猫商城系统的实现

    目录 一.项目介绍 二.项目运行 三.效果图 四.核心代码 权限基础控制层 用户信息操作控制层 用户订单控制层 后台管理员品类控制层 后台管理-产品页控制层 一.项目介绍 迷你天猫商城是一个基于SSM框架的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作. 作为模拟天猫商城系统的核心组成部分之一,采用SSM框架的天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个

  • iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    以前瀑布流的时候使用过UICollectionView,但是那时使用的是系统自带的UICollectionViewFlowLayout布局,今天看文章,看到UICollectionViewFlowLayout自定义相关的东西,于是动手写了一个简单图片浏览的demo,熟练一些UICollectionViewFlowLayout自定义布局. #import <UIKit/UIKit.h> @interface JWCollectionViewFlowLayout : UICollectionVie

  • Java实战项目 医院预约挂号系统

    目录 一.项目简述 二.项目运行 登录拦截器代码: 医院预约挂号系统后台管理页面代码: 一.项目简述 功能: 用户分为患者,医生,管理员,患者可进行注册选择医生 挂号,选择日期,选择号源,医生可进行接诊,管理员可 对用户,医生信息的维护等等功能. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持) 项目技术: Jdbc+ Servlert + Jsp + css +

  • JAVA实战项目实现客户选购系统详细流程

    客户选购信息系统功能需求: 1)输入多个客户购买商品信息.包括客户名称,年龄,购买的商品,每种商品的单价和数量. 2)输出多个客户购买商品的信息.包括客户名字,年龄,购买商品,每种商品的单价和数量,总的消费金额. 方法:1)定义一个多个客户信息处理的类 CustomerGoodsAdmin .包括: 属性: Customer [ ]customers 方法: void show () //用户交互界面 void inputCustomerlnfo () / /客户采购信息输入 Void prin

随机推荐