【QT课程设计】二:图片的多选功能与切换功能

前置文章与导航索引

导航索引帖
前置文章,课设第一篇

前言

上一章我们完成了选择图片并打开,细心的同学在做这一部分时候会发现,我们制作了一个多选图片并打开第一张图片显示的功能,但在多选时,我们打开图片将会因为图片命名原因,可能无法准确打开自己想要的图片,本章将开展打开多张图片并相互切换的功能开发。

布局调整

布局样式
布局结构表
这里我们添加了两个label用于显示上一张&下一张,并且做了两个切换按钮,这里暂时我们先不做美化了。

显示上下一张图片的代码实现

思路:其实很简单,因为读入时默认为第一张,所以只需要在BeforeLabel里放入最后一张,AfterLabel里放入第二张就行。
这里用的方法count方法获取总数,由于第一个是0,最后一个则是count()-1,后一张就不用多赘述了。

void MainWindow::on_ChPicBtn_clicked()
{
    //打开图片文件,选择图片
    QStringList srcDirPathListS = QFileDialog::getOpenFileNames(this, tr("选择图片"),
                                                                QDir::homePath(), tr("图像文件(*.jpg *.png *.bmp)"));
    qDebug()<<"图片路径"<<srcDirPathListS; //在控制台输出路径观察
    srcDirPathList = srcDirPathListS;//持久化图片

    imagenum =0;
    QImage image=QImage(srcDirPathList.at(imagenum));//初始化选中第一张图片
    qDebug()<<"image:"<<image;
    if(!image.isNull())
    {
        ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum)),ui->piclabel)));
        ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(srcDirPathList.count()-1)),ui->BeforeLabel)));
        ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum+1)),ui->AfterLabel)));
    }
    else
    {

         return;
    }
}

这里代码难度不大,但我为了后续操作能共用这个读取到的List,在头文件中建了一个List来存储,同时用imagenum来记录当前image是第几张。所以,别忘了在头文件中添加代码。

//mainwindow.h
    int imagenum;
    QStringList srcDirPathList;

效果图
到此,显示前后一张图片的功能已经完成了。

切换上下张

原理:做到这里,切换上下张的功能已经很简单了,只需要将imagenum数字加减,再重新显示图片就行了。

void MainWindow::on_BeforeBtn_clicked()
{
    //切换imagenum为上一张
    if (imagenum=0){
        imagenum=srcDirPathList.count()-1;
    }
    else {
        imagenum=imagenum+1;
    }
    ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum)),ui->piclabel)));
    ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum-1)),ui->BeforeLabel)));
    ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum+1)),ui->AfterLabel)));
}

这个功能非常简单明了了吧。
但写到这里,会发现有个问题,我们在显示当前图片这个环节,代码重复度有点高了。为了避免后续修改压力大以及代码不美观,我们这里将显示图片整合为单独的方法。

void MainWindow::ImageShow(int imagenum)
{
    if(imagenum==0)
    {
    ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum)),ui->piclabel)));
    ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(srcDirPathList.count()-1)),ui->BeforeLabel)));
    ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum+1)),ui->AfterLabel)));
    }
    else if(imagenum==(srcDirPathList.count()-1))
    {
       ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum)),ui->piclabel)));
       ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum-1)),ui->BeforeLabel)));
       ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(0)),ui->AfterLabel)));
    }
    else
    {
        ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum)),ui->piclabel)));
        ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum-1)),ui->BeforeLabel)));
        ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum+1)),ui->AfterLabel)));
    }
}

这边分类讨论了当前图片为第一张、最后一张、其他情况,小伙伴们应该都能看懂,就不多赘述了。

修改错误

至此,切换上下张功能也完成了。
但做过测试的小伙伴们会发现,如果没选中图片就点击上下张会报错&选择图片后未选中退出会报错,这里来处理一下这个问题。

首先是对于打开图片这边的调整:

void MainWindow::on_ChPicBtn_clicked()
{
    //打开图片文件,选择图片
    QStringList srcDirPathListS = QFileDialog::getOpenFileNames(this, tr("选择图片"),
                                                                QDir::homePath(), tr("图像文件(*.jpg *.png *.bmp)"));
    qDebug()<<"图片路径"<<srcDirPathListS; //在控制台输出路径观察
    srcDirPathList = srcDirPathListS;//持久化图片
    if(!srcDirPathList.isEmpty())
    {
        imagenum =0;
        QImage image=QImage(srcDirPathList.at(imagenum));//初始化选中第一张图片
        qDebug()<<"image:"<<image;
       ImageShow(imagenum);
    }
    else if(srcDirPathList.isEmpty())
    {

         return;
    }
}

这里将逻辑顺序更改了,当我们读取到图片后,srcDirPathList才会有数值。srcDirPathList不为空才能初始化图片,这样就不会数据溢出造成程序异常了。

再是对上下一张的处理。

void MainWindow::ImageShow(int imagenum)
{

    ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum)),ui->piclabel)));

    if(imagenum-1<0)
    {
    ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(srcDirPathList.count()-1)),ui->BeforeLabel)));
    }
    else
    {
     ui->BeforeLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum-1)),ui->BeforeLabel)));
    }

    if(imagenum+1 >= srcDirPathList.count())
    {
     ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(0)),ui->BeforeLabel)));
    }
    else {
      ui->AfterLabel->setPixmap(QPixmap::fromImage(ImageSetSize(QImage(srcDirPathList.at(imagenum+1)),ui->BeforeLabel)));
    }
}

当我们没打开图片就点击上下一张时,程序将提示我们先选择图片,并return回点击前的状态,就不会因为没选择就点击而程序异常了。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码 毕业设计 课程设计 项目开发 系统开发 QT 数据库 源代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值