Qt图片定时滚动

news2025/7/18 0:48:41

目录

  • 参考
    • 结构
    • PicturePlay.pro
    • main.cpp
    • pictureplay.h
    • pictureplay.cpp
    • pictureplay.ui
  • 效果

参考

Qt图片浏览器

QT制作一个图片播放器

Qt中自适应的label+pixmap充满窗口后,无法缩小只能放大

可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开文件选择,定时滚动图片

重载实现dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口大小改变)

结构

在这里插入图片描述

PicturePlay.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    pictureplay.cpp

HEADERS += \
    pictureplay.h

FORMS += \
    pictureplay.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    res.qrc

main.cpp

#include "pictureplay.h"

#include <QApplication>
#include<QFile>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 加载样式文件
    QFile file(":/style.qss");
    /*判断文件是否存在*/
    if(file.exists())
    {
        file.open(QFile::ReadOnly);// 以只读的方式打开
        //QString styleSheet=QLatin1String(file.readAll());// 以Latin-1编码的字符串的方式保存读出的结果
        QString styleSheet=QString(file.readAll());// 以默认编码的字符串的方式保存读出的结果
        qApp->setStyleSheet(styleSheet);// 设置全局样式
        file.close();// 关闭文件
    }
    PicturePlay w;
    w.show();
    return a.exec();
}

pictureplay.h

#ifndef PICTUREPLAY_H
#define PICTUREPLAY_H

#include <QWidget>
#include <QFile>
#include <QDir>
#include <QTimer>
#include <QThread>
#include <QFileDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class PicturePlay; }
QT_END_NAMESPACE

class PicturePlay : public QWidget
{
    Q_OBJECT

public:
    PicturePlay(QWidget *parent = nullptr);
    ~PicturePlay();
private slots:

    void myautoPhoto(); //自动播放函数
    void showDinamicPhoto(QString path);//动态图播放(格式为gif)

    void on_pathBtn_clicked();//浏览:打开目录

    void on_autoPhoto_clicked(bool checked);//自动播放选择

    void on_photoList_clicked(const QModelIndex &index);//单击播放图片

    void my_currentRowChanged(int Row);// // 当前项变化
    void on_cleanBtn_clicked();//清除

private:

    QString Dir;//打开文件的路径
    QString tempDir; //照片的绝地路径
    QVector<QString> photoPath;//存放照片相对路径的容器
    QTimer *mtime; //定时器
    QString delayTime; //延时间隔
    bool autoFlag; //判断是否进入的自动播放格式
    int num; //照片张数
    // 如果文件的后缀名是jpg、jpeg、bmp或png,则接受拖放事件,否则忽略拖放事件
    QStringList acceptedFileTypes;

    void dragEnterEvent(QDragEnterEvent *event)override;//拖进事件
    void dropEvent(QDropEvent *event)override;// 拖进放下事件
    void resizeEvent(QResizeEvent *event)override;//用于在窗口大小改变时处理事件
    QPixmap pixmap;
private:
    Ui::PicturePlay *ui;
};
#endif // PICTUREPLAY_H

pictureplay.cpp

#include "pictureplay.h"
#include "ui_pictureplay.h"
#include<QDebug>
#include<QMessageBox>
#include<QMovie>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
PicturePlay::PicturePlay(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::PicturePlay)
{
    ui->setupUi(this);
    this->setWindowTitle("图片播放器");
    this->setWindowIcon(QIcon(":/ImageEye.jpg"));
    this->setAcceptDrops(true);//设置允许向窗口拖入图片
    this->setMinimumSize(QSize(400,300));// 设置最小值

    ui->photoShow->setAlignment(Qt::AlignCenter);  //居中显示

    //自适应的label+pixmap充满窗口后,无法缩小只能放大
    ui->photoShow->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);// Ignored忽略

    // 设置拉伸因子(默认缩到最小时失效:一样大小)
    ui->horizontalLayout_2->setStretch(1,3);

    //设置窗口布局,(此时控件会随窗口缩放)
    this->setLayout(ui->horizontalLayout_2);
    //  设置水平布局控件到边框距离(左,上,右,下)
    ui->horizontalLayout_2->setContentsMargins(5,0,5,0);

    ui->photoPath->setFocusPolicy(Qt::NoFocus);//无法获得焦点,自然无法输入,其他文本控件类似
    ui->photoPath->setPlaceholderText("绝对路径");
    ui->delayEdit->setPlaceholderText("秒");

    //不显示行向滚动条,子项文本过长自动显示...
    ui->photoList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    num=0; //照片张数
    delayTime.clear(); //延时间隔
    mtime = new QTimer(this);


    //连接自动播放槽函数
    connect(mtime,SIGNAL(timeout()),this,SLOT(myautoPhoto()));
    connect(ui->photoList,SIGNAL(currentRowChanged(int)),this,SLOT(my_currentRowChanged(int)));


    // 如果文件的后缀名是jpg、jpeg、bmp或png,则接受拖放事件,否则忽略拖放事件
    acceptedFileTypes.append("jpg");
    acceptedFileTypes.append("jpeg");
    acceptedFileTypes.append("bmp");
    acceptedFileTypes.append("png");
    acceptedFileTypes.append("gif");
}

PicturePlay::~PicturePlay()
{
    delete ui;
}
//自动播放函数
void PicturePlay::myautoPhoto()
{
    tempDir.clear();
    tempDir=photoPath.at(num); //从容器中找到要播放的照片的相对路径

    ui->photoList->setCurrentRow(num);// QListWidget项跳动

    if(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif"))
    {
        showDinamicPhoto(tempDir);
        num++;
    }

    else if(!(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif")))
    {
        // 内容是否自动缩放,参数true自动缩放
        ui->photoShow->setScaledContents(true);//显示图片的全部
        pixmap.load(tempDir);// 更新全局图片
        ui->photoShow->setPixmap(QPixmap(tempDir));//显示图片


        //判断自动播放的时候是否播放到了最后一张图片,如果是则停止自动播放
        if(num ==  (photoPath.count()-1))
        {
            //qDebug()<<num;
            if(ui->loopPlayback->checkState()==Qt::Checked)//循环重放
            {
                num = -1;// 下面num++,为了循环重放回到第一张图片
                qDebug()<<num;
            }
            else
            {
                mtime->stop();
                num = 0;
                if(autoFlag)//选中自动播放的情况
                {
                    autoFlag = false;
                }
                //qDebug()<<num;
                ui->autoPhoto->setCheckState(Qt::Unchecked);//把自动播放按钮置于没有选择的状态
            }
        }

        if(autoFlag)
        {
            num++;
        }
    }
}
//动态图播放(格式为gif)
void PicturePlay::showDinamicPhoto(QString path)
{
    QMovie *movie = new QMovie(path);  // path图片路径
    movie->start(); //开始播放动态图
    ui->photoShow->setMovie(movie); //将图片设置为为动态
    ui->photoShow->setScaledContents(true); //尽可能完整的播放整张动图 ,此处要设置为true
}

//浏览:打开目录
void PicturePlay::on_pathBtn_clicked()
{
    Dir = QFileDialog::getExistingDirectory(this);//获取本文件所在的具体路径
    //qDebug()<<"路径:"<<Dir;
    ui->photoPath->setText(Dir);//显示打开的文件的具体路径
    QDir dir(Dir);
    QStringList file;
    QFileInfoList fileList = dir.entryInfoList(file,QDir::Files); //获取目录下的文件
    QString fileDir; //保存图片所在的路径
    //列出目录下的文件
    for(int i=0;i<fileList.count();i++)
    {
        QFileInfo info = fileList.at(i);
        fileDir.clear();
        if(info.fileName() == "." || info.fileName() == "..") //跳过这两个目录
        {
            continue;
        }
        // 检查文件的后缀名是否在接受的文件类型列表中;(获取文件的后缀名,并将其转换为小写字母)
        if(!acceptedFileTypes.contains(info.suffix().toLower()))
        {
            continue;
        }

        fileDir+=Dir + "/";
        QString filename = info.fileName();
        fileDir+=filename;
        photoPath.append(fileDir);// 把图片的路径装到容器中

        QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件缩小图标
        item->setToolTip(info.fileName());// tip提示
        item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置
        ui->photoList->addItem(item);//把图片相对路径显示到窗口中
    }
    if(ui->photoList->count()==0)
    {
        QListWidgetItem *item = new QListWidgetItem("无合适图片");
        item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置
        ui->photoList->addItem(item);//把图片相对路径显示到窗口中
    }
}

//自动播放选择
void PicturePlay::on_autoPhoto_clicked(bool checked)
{
    if(ui->delayEdit->text().isEmpty())
    {
        QMessageBox::warning(this,"提示","请输入需要间隔的播放时间(秒)");
        //把按钮重新置于没有被选中的状态;不要用setCheckable()函数[不可用],很容易出错
        ui->autoPhoto->setCheckState(Qt::Unchecked);
        return;
    }
    else if(ui->photoList->count() == 0)
    {
        QMessageBox::warning(this,"警告","还没有可以播放的图片");
        ui->autoPhoto->setCheckState(Qt::Unchecked); //把按钮重新置于没有被选中的状态
        return;
    }
    else if(checked) //启动定时器
    {
        delayTime = ui->delayEdit->text();
        mtime->start(delayTime.toInt()*1000);//启动定时器并设置播放时间间隔
        autoFlag = true;// 选中自动播放
    }
    else if(!checked)//停止定时器
    {
        mtime->stop();//停止定时器
        delayTime.clear();
        autoFlag = false;
    }
}

//单击播放图片
void PicturePlay::on_photoList_clicked(const QModelIndex &index)
{
    qDebug()<<"单击播放图片";
    Q_UNUSED(index);//忽略编译器发出的警告,表明变量event未使用
    //如果选中了自动播放的情况下,点击列表中的内容,则停止自动播放
    if(autoFlag) //选中自动播放的情况
    {
        mtime->stop();
        //把按钮重新置于没有被选中的状态;不要用setCheckable()函数[不可用],很容易出错
        ui->autoPhoto->setCheckState(Qt::Unchecked);
        autoFlag = false;
    }
    num = ui->photoList->row(ui->photoList->currentItem()); //获取当前点击的内容的行号
    //在没有选中自动播放的情况下,判断当前是否点击了最后一张照片,如果是最后一张照片,在选中自动播放的情况下让它返回到第一张照片
    if(!autoFlag&&num == ui->photoList->count())
    {
        num = 0;
    }
    tempDir.clear();
    /*tempDir+=Dir+"/";
    QString path = ui->photoList->currentItem()->text();
    tempDir+=path*/;
    tempDir=photoPath.at(num); //从容器中找到要播放的照片的相对路径

    //判断是否是动态图;endsWith()字符串结尾
    if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif"))
    {
        showDinamicPhoto(tempDir);
    }
    else
    {
        // 内容是否自动缩放,参数true自动缩放
        ui->photoShow->setScaledContents(true);//显示图片的全部
        pixmap.load(tempDir);// 更新全局图片
        ui->photoShow->setPixmap(QPixmap(tempDir));//显示图片
    }
}
// 当前项变化
void PicturePlay::my_currentRowChanged(int Row)
{
    qDebug()<<"当前项变化:"<<Row;
}
//拖进事件
void PicturePlay::dragEnterEvent(QDragEnterEvent *event)
{
    // 用于检查拖放的数据是否包含URL,并且获取拖放事件中的URL数量==1
    if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1)
    {
        // 获取拖放事件中的第一个URL的本地文件路径
        QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
        // 检查文件的后缀名是否在接受的文件类型列表中;(获取文件的后缀名,并将其转换为小写字母)
        if(acceptedFileTypes.contains(file.suffix().toLower()))
        {
            event->acceptProposedAction();//表明用户可以在窗口部件上拖放对象[接受拖放事件的操作]
        }
    }
}
// 拖进放下事件
void PicturePlay::dropEvent(QDropEvent *event)
{
    // 获取拖放事件中的第一个URL的本地文件路径
    QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());

    //qDebug()<<"绝对路径:"<<file.absoluteFilePath();
    //从文件中加载图片,参数file.absoluteFilePath()表示包含文件名的绝对路径,load()返回一个bool值,表示是否加载成功
    if(pixmap.load(file.absoluteFilePath()))
    {
        // 将图片缩放到指定大小,参数ui->label->size()表示缩放的大小,Qt::KeepAspectRatio表示保持图片的宽高比,Qt::SmoothTransformation表示使用平滑缩放算法
        ui->photoShow->setPixmap(pixmap.scaled(ui->photoShow->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));

        ui->photoPath->setText(file.absolutePath());//显示打开的文件的绝对路径,这不包括文件名。
        photoPath.append(file.absoluteFilePath());// 把图片的路径装到容器中

        QListWidgetItem *item = new QListWidgetItem(QIcon(file.absoluteFilePath()),file.fileName());//建立文件缩小图标
        item->setToolTip(file.fileName());// tip提示
        item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置
        ui->photoList->addItem(item);//把图片相对路径显示到窗口中
    }else
    {
        // 错误消息框
        QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
    }
}
//用于在窗口大小改变时处理事件
int i=0;
void PicturePlay::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);//忽略编译器发出的警告,表明变量event未使用
    qDebug()<<"窗口大小改变:"<<i++;
    if(!pixmap.isNull())
    {
        ui->photoShow->setPixmap(pixmap.scaled(ui->photoShow->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }
}
// 清除
void PicturePlay::on_cleanBtn_clicked()
{
    mtime->stop();
    num = 0;
    if(autoFlag)//选中自动播放的情况
    {
        autoFlag = false;
    }
    pixmap.fill(Qt::transparent);//函数用于将QPixmap对象pixmap清空,参数Qt::transparent表示填充透明色,无返回值
    ui->autoPhoto->setCheckState(Qt::Unchecked);//把自动播放按钮置于没有选择的状态
    ui->loopPlayback->setCheckState(Qt::Unchecked);//把循环重放钮置于没有选择的状态
    photoPath.clear();
    ui->photoPath->clear();
    ui->photoShow->clear();
    ui->photoList->clear();
}

pictureplay.ui

在这里插入图片描述

效果

  • 启动
    在这里插入图片描述
  • 运行
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LDO 芯片烫手,问题出在哪里?

设计失误的一个电路&#xff0c;该电路是数字电路的电源&#xff0c;为图方便对12V直接通过线性电源芯片降压到5V&#xff1a; 图1&#xff1a;线性电源降压12V转5V 几块电路板打样好后&#xff0c;测试均发现AMS1117-5.0芯片烫手&#xff0c;负载电流100mA多&#xff0c;也满…

vim命令快捷键

1.概述vim在linux系统下代码补全、编译及错误跳转等方便编程的功能丰富&#xff0c;被广泛使用。简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。vim 是一个…

从零开始的机械臂yolov5抓取gazebo仿真(环境搭建篇中)

yolov5运行环境搭建 本篇主要讲如何搭建yolov5运行环境&#xff0c;以及一些需要注意避坑的重要知识点。anaconda与显卡驱动先装后装是没有什么影响的&#xff0c;关键在于&#xff0c;不能将显卡驱动以及cuda装在虚拟环境中。这里介绍一下博主的电脑环境为i7九代ubuntu18.04r…

移动办公时代,数智化平台如何赋能企业管理升级?

在传统的办公模式下&#xff0c;企业组织办公不仅时效低&#xff0c;周期长、成本高&#xff0c;且各办公系统相互独立。随着社会经济的发展&#xff0c;人们的工作生活变得多样化&#xff0c;对于办公的需求也越来越多&#xff0c;存在明显弊端的传统办公模式已不能满足企业对…

基于Mirai框架的Chatgpt_qq机器人搭建

参考项目&#xff1a;https://github.com/lss233/chatgpt-mirai-qq-bot by&#xff1a;雪月三十 采用docker方式搭建 方便快捷 不建议放在云服务器上 本地要有代理才行&#xff08;也可以自行配置代理&#xff09; 以下操作均是在有代理的情况下进行的 克隆项目 git clone ht…

狐狸优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

K8S篇-搭建kubenetes集群

安装环境 这里使用pve虚拟机搭建三台centos机器&#xff0c;搭建过程参考: Centos篇-Centos Minimal安装 此次安装硬件配置 CPU&#xff1a;2C 内存&#xff1a;2G 存储&#xff1a;64G 环境说明 操作系统&#xff1a;Centos 7.9 内核版本&#xff1a;6.2.0-1.el7.elrepo…

4面美团软件测试工程师,却忽略了这一点,直接让我前功尽弃

说一下我面试别人时候的思路 反过来理解&#xff0c;就是面试时候应该注意哪些东西&#xff1b;用加粗部分标注了 一般面试分为这么几个部分&#xff1a; 一、自我介绍 这部分一般人喜欢讲很多&#xff0c;其实没必要。大约5分钟内说清楚自己的职业经历&#xff0c;自己的核…

论坛项目小程序和h5登录

项目中安装uview出现npm安装uview 直接报错&#xff1a;创建一个package.json配置文件在进行安装。cmd到项目。初始化一个package.json文件&#xff08;vue项目的配置文件&#xff09; npm init --yes 安装uview项目点击关注进入管页面&#xff0c;需要验证用户是否登录查用户是…

Python编程自动化办公案例(3)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.前几章代码 1.获取到第一题的选项单元格 2.实现批量获取文件 二. 批…

Linux——UDP协议与相关套接字编程

一.概念在网络通信中&#xff0c;传输层中最常用的通信协议有两个&#xff1a;TCP协议与UDP协议。这两种协议虽然都可以用于网络通信&#xff0c;但是通信方式不同决定了应用场景的不同。与TCP协议相比&#xff0c;UDP协议最具特色的不同点有两个&#xff1a;无连接与面向数据报…

kubernetes集群pod中的pause容器作用

kubernetes集群pod中的pause容器作用 我们搭建完集群了以后&#xff0c;可以使用最简单的方式创建一个pod&#xff0c;随意你建立什么pod&#xff0c;去访问相应node上执行docker ps 就会看到有一种pause容器&#xff0c;但是你可能从来没有启用 etrics-scraper_dashboard-me…

C++中的内存管理

文章目录前言1.C中内存空间的划分2.C内存管理方式1.对内置类型的处理2.对自定义类型的处理3.new和delete实现原理4.定位new3.总结1. malloc/free和new/delete的区别2. 内存泄漏前言 C中的内存空间划分和C语言是很像的&#xff0c;基本上区别不大。但是因C中&#xff0c;引入了…

【华为OD机试模拟题】用 C++ 实现 - 找字符(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

MyBatis-常用SQL操作

一、动态SQL 1.概述】 1.1动态SQL&#xff1a; 是 MyBatis 的强大特性之一&#xff0c;解决拼接动态SQL时候的难题&#xff0c;提高开发效 1.2分类&#xff1a; if choose(when,otherwise) trim(where,set) foreach 2.if 2.1 做 where 语句后面条件查询的,if 语句是可以…

【OpenFOAM】-olaFlow-算例10-wavemakerTank

算例路径&#xff1a; olaFlow\tutorials\wavemakerTank 算例描述&#xff1a; 采用 Flap和Piston两种方式的动网格进行造波 学习目标&#xff1a; 了解 olaDyMFlow 的使用&#xff1b;理解动网格使用和参数设置&#xff0c;理解 dynamicMotionSolverFvMesh 参数设置&#xff1…

ChatGPT对于普通人有什么机会和影响?

ChatGPT爆火“出圈”&#xff0c;短短三个月里&#xff0c;势如破竹。 月活已经达到1亿&#xff0c;什么概念呢&#xff1f;Tiktok在海外达到1亿月活用了将近9个月时间&#xff0c;Instagram用了大约2年半&#xff0c;就连比尔盖茨都表示“Web3没那么重要&#xff0c;元宇宙没…

STM32---备份寄存器BKP和 FLASH学习使用

BKP库函数 学习BKP&#xff0c;首先就是知道BKP每一个函数的作用然后如何使用即可 使用备份域的作用只需要操作上面的两个函数即可&#xff0c;其余的都是它的其他功能 BKP简介 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份…

【Jupyter Notebook的简单入门使用】

【Jupyter Notebook的简单入门使用】简单介绍安装与配置简单使用Markdown关闭简单介绍 Jupyter官网 Jupyter Notebook 介绍 简单来讲&#xff0c;它是一个网页应用&#xff0c;可以进行文档编写&#xff0c;甚至运行 py 代码等功能 安装与配置 下载合适版本的 python &#…

【C语言】带你彻底理解指针(1)

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨ 文章目录指针的介绍&#xff1a;一、简单指针&#x1f308;1.1 指针的定义与使用1.2 指针与数组二、指针数组✨三、数组指针&#x1f31e;3.1 数组指针的定义3.2 ”数组名“与”&数组名“3.…