使用Qt制作简易的图片查看器_qt 实现图片工具-程序员宅基地

技术标签: qt  开发语言  

我们知道windows系统有自带的图片查看器,那么我们也可以用Qt制作一款类似的图片查看器,实现图片的打开查看以及图片的翻页,下面我就来分享一下图片查看器的制作方法。

目录

一、描述

二、代码实现

1.头文件

2.源文件

3.结果展示


一、描述

实现图片浏览器用到的知识,包括窗口部件、布局、事件、对象模型与容器类、图形视图、模型/视图编程以及多线程等。大致流程为:首先定义一个图片类,该类包含图片的路径、文件名、文件id以及获取这些变量的函数。然后定义了一个图片数组类,主要包含添加图像以及获取所有图像以及新加入图像的函数。最后通过将图片名字加入到界面左侧QDockWidget部件中的QTreeView中,通过线程将图片的预览加入界面下侧的窗口部件中。最后通过双击可查看完整图片,以及通过滚轮和鼠标等事件来对图片进行一些操作。
 

  • 显示图片区域是一个 label
  • 左右箭头是一个 pushButton 查看上一张 下一张图片的
  • 中间的单行文本框(lineEdit)显示图片路径
  • 选择图片:单击打开文件对话框选择多张图片

控件没有什么难度,主要就是打开文件夹,自动计算文件夹下的所有文件存储到队列中,队列中可以是图片的完整路径,也可以是图片,可以切换,如果选择内存加载模式则会自动将路径转为图片,这样的话有个好处,就是在翻页查看图片的时候速度会非常的快,因为直接显示的是内存中的图片,而不需要重新加载路径,毕竟路径加载图片又需要重新读取硬盘。

系统提示篇幅过短,所以下面是歌词分享:

《只因你太美》歌词 
所属专辑:只因你太美
演唱者:SWIN-S
作词:WILLIUS / RK / 蔡徐坤
作曲:WILLIUS
编曲:WILLIUS
只因你太美 baby 只因你太美 baby
只因你实在是太美 baby 只因你太美 baby
迎面走来的你让我如此蠢蠢欲动
这种感觉我从未有
Cause I got a crush on you who you
你是我的我是你的谁
再多一眼看一眼就会爆炸
再近一点靠近点快被融化
想要把你占为己有baby bae
不管走到哪里都会想起的人是你 you you
我应该拿你怎样
uh 所有人都在看着你
我的心总是不安
oh 我现在已病入膏肓
eh eh 难道真的因为你而疯狂吗
我本来不是这种人
因你变成奇怪的人
第一次呀变成这样的我
不管我怎么去否认
只因你太美 baby 只因你太美 baby
只因你实在是太美 baby 只因你太美 baby
oh eh oh 现在确认地告诉我
oh eh oh 你到底属于谁
oh eh oh 现在确认地告诉我
oh eh oh 你到底属于谁 就是现在告诉我
跟着这节奏 缓缓 make wave
甜蜜的奶油 it's your birthday cake
男人们的 game call me 你恋人
别被欺骗愉快的 I wanna play
我的脑海每分每秒只为你一人沉醉
最迷人让我神魂颠倒是你身上香水
oh right baby I'm fall in love with you
我的一切你都拿走只要有你就已足够
我到底应该怎样
uh 我心里一直很不安
其他男人们的视线
Oh 全都只看向你的脸
Eh eh 难道真的因为你而疯狂吗
我本来不是这种人
因你变成奇怪的人
第一次呀变成这样的我
不管我怎么去否认
只因你太美 baby 只因你太美 baby
只因你实在是太美 baby 只因你太美 baby
我愿意把我的全部都给你
我每天在梦里都梦见你还有我闭着眼睛也能看到你
现在开始我只准你看我
I don’t wanna wake up in dream 我只想看你这是真心话
只因你太美 baby 只因你太美 baby
只因你实在是太美 baby 只因你太美 baby
oh eh oh 现在确认的告诉我
oh eh oh 你到底属于谁
oh eh oh 现在确认的告诉我
oh eh oh 你到底属于谁就是现在告诉我

二、代码实现

1.头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QDebug>
#include <QPushButton>  //按钮
#include <QFileDialog>  //文件对话框
#include <QStringList>
#include <QVBoxLayout>
#include <QHBoxLayout>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void show_pic();
    void up_pic();
    void down_pic();

private:
    QLabel *l;
    QPushButton *pb1, *pb2, *pb3;
    QStringList filename;
    int pos;
};

#endif // WIDGET_H

2.源文件

#include "widget.h"
#include <QApplication>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    l = new QLabel("showpic", this);
    l->setFixedSize(800, 600);
    l->setAlignment(Qt::AlignCenter);
    l->setPixmap(QPixmap(":/pic/cxk.jpg"));
    l->setScaledContents(true); //设置自适应

    pb1 = new QPushButton;
    pb1->setFixedSize(100, 100);
    pb1->setIcon(QIcon(":/pic/open.png")); //设置图标
    pb1->setIconSize(pb1->size());  //设置图标大小
    pb1->setFlat(true);  //设置透明

    pb2 = new QPushButton;
    pb2->setFixedSize(100, 100);
    pb2->setIcon(QIcon(":/pic/up.png")); //设置图标
    pb2->setIconSize(pb2->size());  //设置图标大小
    pb2->setFlat(true);  //设置透明

    pb3 = new QPushButton;
    pb3->setFixedSize(100, 100);
    pb3->setIcon(QIcon(":/pic/down.png")); //设置图标
    pb3->setIconSize(pb3->size());  //设置图标大小
    pb3->setFlat(true);  //设置透明

    pb2->setEnabled(false);
    pb3->setEnabled(false);

    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addStretch();
    hbox->addWidget(pb2);
    hbox->addWidget(pb1);
    hbox->addWidget(pb3);
    hbox->addStretch();

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(l);
    vbox->addLayout(hbox);
    setLayout(vbox);

    connect(pb1, SIGNAL(clicked(bool)), this, SLOT(show_pic()));
    connect(pb2, SIGNAL(clicked(bool)), this, SLOT(up_pic()));
    connect(pb3, SIGNAL(clicked(bool)), this, SLOT(down_pic()));
}

Widget::~Widget()
{

}

void Widget::show_pic()
{
    QStringList names;
    names = (QFileDialog::getOpenFileNames(this, "所有图片", ".", "Image Files (*.png *.jpg *.bmp)"));
    if(names.isEmpty())
        return;
    filename = names;
    pos = 0;
    l->setPixmap(QPixmap(filename.at(pos)));
    pb2->setEnabled(true);
    pb3->setEnabled(true);
}


void Widget::up_pic()
{
    if(pos == 0)
       pos = filename.length()-1;
    else
       pos--;
    l->setPixmap(QPixmap(filename.at(pos)));
}

void Widget::down_pic()
{
    if(pos == filename.length()-1)
       pos = 0;
    else
       pos++;
    l->setPixmap(QPixmap(filename.at(pos)));

}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

3.结果展示

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_65155181/article/details/126786199

智能推荐

在Ubuntu16.04中安装nvidia驱动_nvlink ubuntu-程序员宅基地

文章浏览阅读918次。对于双显卡(intel集显 + nvidia独显)的电脑,安装windows10和ubuntu 双系统时,往往会因为ubuntu中缺少 nvidia 驱动而出现各种启动问题。本文讲述的就是在ubuntu16.04上安装nvidia驱动,来解决前面提到的问题。第一步:从英伟达(nvidia)官网上下载相应的驱动文件,文件后缀名为.run。我的电脑是联想小新的,快捷键要在同时按下 键盘上的 Fn 键..._nvlink ubuntu

ubuntu使用docker_ubuntu进入docker-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏4次。docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现。_ubuntu进入docker

线程安全和可重入函数的区别与联系-程序员宅基地

文章浏览阅读75次。一、线程安全线程安全:如果一个函数在同一时刻可以被多个线程安全的调用,就称该函数是线程安全的。不需要共享时,请为每个线程提供一个专用的数据副本。如果共享非常重要,则提供显式同步,以确保程序以确定的方式操作。通过将过程包含在语句中来锁定和解除锁定互斥,可以使不安全过程变成线程安全过程,而且可以进行串行化。很多函数并不是线程安全的,因为他们返回的数据是存放在静态的内存缓冲区中的。..._可重入函数与线程安全的区别与联系

两款免费好用的OPCUA服务端模拟器_opcua模拟器-程序员宅基地

文章浏览阅读3k次。启动Softing OPC Client输入连接信息后可以看到已经连接到OPC服务器。打开文件目录下的.config,修改IP和端口号即可。Softing OPC Client显示已经连接。_opcua模拟器

【漏洞复现】宏景ehr-hcm-templates-文件读取-程序员宅基地

文章浏览阅读186次,点赞3次,收藏3次。宏景HCM系统是一款由宏景软件研发的系统,主要功能包括人员、组织机构、档案、合同、薪资、保险、绩效、考勤、招聘、培训、干部任免和人事流程等业务的管理,以及人事、绩效、培训、招聘、考勤等业务自助,还具备了报表功能和灵活的表格工具,支持集团管控、目标管理、领导决策等应用。宏景HCM系统templates接口存在文件读取漏洞。攻击者可以通过发送特定的POST请求,利用该漏洞获取系统敏感文件。

Oracle数据库入门笔记(上)-程序员宅基地

文章浏览阅读987次,点赞15次,收藏14次。语法:DROP TABLE 表名。

随便推点

【前端基础小案例】HTML+CSS实现酷狗音乐热榜效果_酷狗音乐html和css代码-程序员宅基地

文章浏览阅读3k次,点赞11次,收藏67次。超级简单的案例_酷狗音乐html和css代码

【水声通信】OFDM-QPSK水声通信仿真(含误码率检测)【含Matlab源码 3954期】_水声相控阵仿真-程序员宅基地

文章浏览阅读786次,点赞20次,收藏21次。OFDM-QPSK水声通信仿真(含误码率检测)完整的代码,方可运行;可提供运行操作视频!适合小白!_水声相控阵仿真

Android中Editext响应回车键事件_android edittext 回车事件-程序员宅基地

文章浏览阅读182次。Editext 按键响应回车事件事件。_android edittext 回车事件

iSCSI存储系统知识详解_iscsi目前发展状况-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏25次。原文:https://community.emc.com/docs/DOC-33815SCSI 即 小型计算机系统接口 。小型计算机系统接口(英语:Small Computer System Interface; 简写:SCSI),一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。SCSI是一种智能的通用接口标准。它是各种计算机与外部_iscsi目前发展状况

C# 不能引用命名空间_hybridclr 引用不了c#的命名空间-程序员宅基地

文章浏览阅读701次。C# 不能引用命名空间_hybridclr 引用不了c#的命名空间

win修改时间格式-程序员宅基地

文章浏览阅读346次,点赞8次,收藏6次。根据大佬操作未能实现,在最后一步,还需要什么操作吗?

推荐文章

热门文章

相关标签