Qt 小项目 图片浏览系统

news/2024/4/25 7:38:39/文章来源:https://blog.csdn.net/q610098308/article/details/129235311

 

目录

引言

实现功能:

效果:

实现图片浏览所用知识:

实现流程:

实现环境和UI设计

具体实现


引言

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

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

此系统增加一个列表;

实现功能:

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

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

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

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

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

效果:

pic-system

实现图片浏览所用知识:
 

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


实现流程:

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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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;     //点击鼠标时获取的横坐标xstatic int press_y;     //点击鼠标时获取的纵坐标ystatic int relea_x;     //松开鼠标时获取的横坐标xstatic int relea_y;     //松开鼠标时获取的纵坐标yQMouseEvent *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));
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74936.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职场性别报告,男女薪酬仍有差距,男性平均薪酬比女性高29.7%

性别是否影响职业&#xff1f;女性求职比男性更加困难&#xff1f;男性薪酬比女性更有优势&#xff1f;人们一说到警察、建筑师通常会想到高大魁梧的男性形象&#xff0c;一说到幼师、护士往往想到的都是温柔的女性形象&#xff0c;职业好似与性别挂钩&#xff1b;女性求职通常…

vue脚手架多页自动化生成实践

前言 在前端开发过程中&#xff0c;常常面对多种业务场景。到目前为止&#xff0c;前端对于不同场景的处理通常会采用不同的渲染方案来组合处理&#xff0c;常见的渲染方案包括&#xff1a;CSR(Client Side Rendering)、SSR(Server Side Rendering)、SSG(Static Site Generati…

LVGL8.3 集成 ST7789V 显示驱动和 CST816T 触摸屏驱动

LVGL8.3 集成 ST7789V 显示驱动和 CTS816S 触摸屏驱动起因效果&#xff08;正常显示&#xff0c;触摸屏可调换X&#xff0c;Y轴&#xff09;使用方式前提操作步骤最后参考起因 LVGL的ESP32 Drivers库中已经包含了大多数显示和触摸芯片的驱动&#xff0c;基本上只需要在MenuCon…

一些无线通信系统模型的概念

一些无线通信系统模型的概念 扩频通信,指的是系统的带宽WWW远大于其信息传输速率R(bits/s)R(bits/s)R(bits/s), 定义展频带因子BeWRB_e \frac{W}{R}Be​RW​, 易知在扩频通信系统中,BeB_eBe​远大于1. 在频率上产生如此大的冗余度,主要是为了减轻无线通信或卫星通信中经常产生…

SpringMVC——响应处理(1)【包含源码分析】

Controller public class JsonReturnController {ResponseBodyGetMapping("/getPet")public Pet getPet(){Pet petnew Pet();pet.setAge(5);pet.setName("lily");return pet;} }项目启动后 浏览器输入 http://localhost:8080/getPet 。 debug DispatcherS…

设备驱动模型--存储技术原理分析笔记 基于2.6.43内核

本文为读书笔记&#xff0c;详细内容参考《存储原理技术分析》1- 驱动模型2- 总线类型2.1- 重要数据结构总线bus_type 和 bus_type_private 互相可以找到对方struct bus_type {const char *name;struct bus_attribute *bus_attrs;struct device_attribute *dev_attrs;s…

BPMN2.0是什么,BPMN能解决企业流程管理中哪些问题?

一、前言&#xff1a; 在任何行业和企业中&#xff0c;一定存在着各式各样的流程&#xff0c;请假流程、报销流程、入职流程、离职流程、出差流程、合同审批流程、出入库流程等等…… 无论是管理者、技术人员还是业务人员&#xff0c;每天肯定也在使用各种流程&#xff0c;但…

Spring彻头彻尾的讲解,按照Spring框架启动流程,逐步剖析问题,不再是大杂烩!

文章目录1. 定义Spring Bean篇1.1 定义Spring Bean的几种方式1.1.1 XML文件定义Spring Bean1.1.2 JavaConfig定义Spring Bean1.1.3 Component注解定义SpringBean1.2 装配Spring Bean的四种常用方式1.2.1 手动装配 XML文件1.2.2 自动装配 XML文件1.2.3 手动装配 JavaConfig文…

C++常见类型及占用内存表

GPS生产厂家在定义数据的时候都会有一定的数据类型&#xff0c;例如double、int、float等&#xff0c;我们知道它们在内存中都对应了一定的字节大小&#xff0c;而我在实际使用时涉及到了端序的问题&#xff08;大端序高字节在前&#xff0c;小端序低字节在前&#xff09;&…

【ICCV2022】 CAPAO:一种高效的单阶段人体姿态估计模型

CAPAO&#xff1a;一种高效的单阶段人体姿态估计模型 重新思考关键点表示&#xff1a;将关键点和姿态建模作为多人姿态估计的对象&#xff08;Rethinking Keypoint Representations: Modeling Keypoints and Poses as Objects for Multi-Person Human Pose Estimation&#xf…

《数据库系统概论》学习笔记——第四章 数据库安全

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 这一章简单记一下那几条sql的用法和两种存取控制和审计&#xff08;今年期末考了&#xff09;吧&#xff0c;不知道有啥好考的 数据库安全性 问题的提出 数据库的一大特点是数据可以共享数据共享必然带来数据库的安全…

idea远程调试线上jar包

有时候本地代码没问题但在线上运行会报错&#xff0c;这时候可以使用idea的remote功能调试线上jar包 步骤1 步骤2&#xff1a;新建remote 步骤3&#xff1a;配置服务器ip和端口 并复制生成的JVM参数供之后使用 步骤4&#xff1a;打jar包&#xff0c;并将生成的jar包放到服务…

Uncaught ReferenceError: jQuery is not defined

今天在拉取项目部署到本地的时候遇到了一个问题特此记录一下 &#xff08;以后闭坑&#xff09; 我和同事同时拉取了一样的代码&#xff0c;结果同事的页面加载正常而我的页面像被狗啃了一样&#xff0c;知道是js的问题但是不知道问题出在哪里&#xff1f;后来还是同事帮我解决…

栈与队列小结

一、理论基础1.队列是先进先出&#xff0c;栈是先进后出2.栈和队列是STL&#xff08;C标准库&#xff09;里面的两个数据结构。栈提供push和pop等等接口&#xff0c;所有元素必须符合先进后出规则&#xff0c;所以栈不提供走访功能&#xff0c;也不提供迭代器。3.栈是以底层容器…

CRM客户管理系统哪个好用?盘点前十名!

CRM客户管理系统排行&#xff1f;盘点前十名&#xff01; CRM客户管理系统是一种集成多种功能的软件系统&#xff0c;可以帮助企业跟进和管理客户关系、提高销售业绩、优化营销策略等。对于企业来说&#xff0c;选择一款适合自己的CRM系统非常重要&#xff0c;因为它能够直接影…

python之web自动化测试框架

梳理下搭建web自动化框架的流程&#xff1a; 创建目录&#xff1a; cases&#xff1a;存放测试用例&#xff0c;unittest框架要求用例名必须以test开头&#xff0c;所以命名test_case.py test_case.py代码如下&#xff1a;继承unittest.TestCase类下面的方法setupclass(),te…

学习 Python 之 Pygame 开发魂斗罗(六)

学习 Python 之 Pygame 开发魂斗罗&#xff08;六&#xff09;继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;五&#xff09;中&#xff0c;我…

感知趋势,洞察发展:2023(第十届)趋势与预测大会成功举办

2023年2月23日&#xff0c;运联年会&#xff1a;2023&#xff08;第十届&#xff09;趋势与预测大会在深圳机场凯悦酒店成功闭幕。自2014年开始&#xff0c;“运联年会&#xff1a;趋势与预测”已经连续举办九届。这场大会&#xff0c;既是一次行业性的“年终总结”&#xff0c…

(四)K8S 安装 Nginx Ingress Controller

ingress-nginx 是 Kubernetes 的入口控制器&#xff0c;使用NGINX作为反向代理和负载均衡器 版本介绍 版本1&#xff1a;Ingress NGINX Controller(k8s社区的ingres-nginx) 以 NGINX 开源技术为基础&#xff08;kubernetes.io&#xff09;&#xff0c;可在GitHub的 kubernet…

记一次java.lang.ClassNotFoundException问题排查过程

记一次java.lang.ClassNotFoundException问题排查过程 同事提供一个or-simulation-engine.jar包&#xff08;非maven项目&#xff0c;内部依赖很多其他jar&#xff0c;这个包是手动打出来的&#xff09;给我&#xff0c;我集成到我的springboot项目中&#xff0c;在本地IDEA启…