zoukankan      html  css  js  c++  java
  • 简易图片查看器

    首先先建一个工程

     然后进入ui界面,拖动出来一个界面

     给他们分别取一些名字 比如 preBtn nextBtn deleteBtn addBtn fileBtn picturelabel


    首先第一个按钮:打开文件

    编写槽函数

    要求点击之后进入标准文件对话框,所以引入头文件

    #include <QFileDialog>

    槽函数

    void Widget::on_fileBtn_clicked()
    {
        //打开的文件对话框设置,分别是对话框标题栏,默认目录,筛选器
        fileNames = QFileDialog::getOpenFileNames(this,"选择图片","F:/芒果/2018名师学习资料合集/Mango天台少女/ttsn018.jpg","所有文件(*);;图片文件(*.jpg *.png *.ico)");
        //当选择打开的图片数为0时(没有选择打开图片),提示massagebox 请选择图片
        if(fileNames.count() == 0)
        {
            QMessageBox::information(this,"选择异常","请选择图片");
            return ;
        }
        //在label中显示刚选择的图片的第一张
        showpic();
    
    }

    这其中要调用到显示图片到label上的函数,所以实现一下这个函数

    void Widget::showpic()
    {
        index = 0;
        //声明一个图片的对象 即为刚刚选择的照片
        QPixmap pic(fileNames[index]);
        //显示该图片(fileNames[index]) 第index张图片
        ui->pictureLabel->setPixmap(pic);
    
        //下面对label大小的修改
        int labelWidth = this->width() - ui->addBtn->width() - 20;
        int labelHight = this->height() - ui->addBtn->height() - 20;
        int picWidtd = pic.width();
        int picHeight = pic.height();
    
        double widthScale = picWidtd * 1.0 / labelWidth;
        double hightScale = picHeight * 1.0 / labelHight;
    
        if(widthScale <= 1 && hightScale <= 1)
        {
            ui->pictureLabel->resize(picWidtd, picHeight);
        }
        else
        {
            if(widthScale > hightScale)
            {
                ui->pictureLabel->resize(labelWidth, picHeight / widthScale);
            }
            else
            {
                ui->pictureLabel->resize(picWidtd / hightScale, labelHight);
            }
        }
    
    }

    接下来实现 上一张 下一张的按钮

    要注意的时当图片已经是第一张/最后一张时的处理

    void Widget::on_preBtn_clicked()
    {
        //当该图片为第一张图片时,按【上一张】是无效的
        if(index == 0)
        {
            return ;
        }
        //不为第一张图片,则下标减1,filenames向前移动1张,并显示出来
        index--;
        showpic();
    }
    void Widget::on_nextBtn_clicked()
    {
        //当图片为最后一张时,按【下一张】是无效的
        if(index == fileNames.count() - 1 )
        {
            return ;
        }
        //当图片不为最后一张时,filenames向后移动1张,并显示出来
        index++;
        showpic();
    }

    接下来 添加 按钮:
    添加时要注意检测重复的问题

    void Widget::on_addBtn_clicked()
    {
        //弹出添加文件的对话框
        QStringList names = QFileDialog::getOpenFileNames(this,"选择图片","C:/Users/huxings/Desktop/学习/qt素材","所有文件(*);;图片文件(*.jpg *.png *.ico)");
        if(names.count() == 0)
        {
            QMessageBox::information(this,"选择异常","请选择图片");
            return;
        }
        for (int i = 0;i < names.count();i++)
        {
            //如果不存在该图片,则添加图片至应用
            if(!isExist(names[i]))
            {
                //qDebug()<<names[i];
                fileNames.insert(index,names[i]);
            }
        }
        showpic();
    }

    图片检测

    bool Widget::isExist(QString &name)
    {
        for(int i = 0;i < fileNames.count(); i ++)
        {
            //文件名相等时(有相同文件),返回真
            if(fileNames[i] == name)
            {
                return true;
            }
        }
        return false;
    }

    最后一个按钮,删除

    void Widget::on_deletBtn_clicked()
    {
        //当最后一张图片被删除后,不能再进行删除操作
        if(index == -1)
        {
            return;
        }
        if(index == fileNames.count() - 1)
        {
           fileNames.removeAt(index);
           index--;
           if(index == -1)
           {
               //最后一张图片被删,则清空label
               index = 0;
               updateBtnState();
               ui->pictureLabel->clear();
               return;
           }
        }
        else
        {
            //删除当前下标的图片
            fileNames.removeAt(index);
        }
        showpic();
    }

    最后加一个更新按钮的操作,当无法查看上一张/下一张图片时,将enable该按钮

    每次showpic()之后调用按钮的刷新函数

    void Widget::updateBtnState()
    {
        //没有图片文件时,所有的按钮都无法使用
        if(fileNames.count() == 0)
        {
            ui->preBtn->setEnabled(false);
            ui->nextBtn->setEnabled(false);
            ui->deletBtn->setEnabled(false);
        }
        else
        {
            //该图片为第一张时,【上一张】按钮无法使用
            if(index != 0)
            {
                ui->preBtn->setEnabled(true);
            }
            else
            {
                ui->preBtn->setEnabled(false);
            }
            //该图片为最后一张时,【下一张】按钮无法使用
            if(index != fileNames.count() - 1)
            {
                ui->nextBtn->setEnabled(true);
            }
            else
            {
                ui->nextBtn->setEnabled(false);
            }
            ui->deletBtn->setEnabled(true);
        }
    }
  • 相关阅读:
    (转)Unity3D研究院之IOS&Android收集Log文件
    (转)C#中的委托(Delegate)和事件(Event)
    c# event Action 判断事件列表中是否存在这个委托
    电子商务 B2C 结构图【转载+整理】
    几个随机算法【转载+整理】
    Windows 2008 R2 配置 DNS 实现二级域名
    Perl、PHP、Python、Java 和 Ruby 比较【转载+整理】
    .NET 托管、非托管、本地:这些代码有什么区别?
    AWR
    HTTP 响应实体主体:XML 及 XML parser
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12829210.html
Copyright © 2011-2022 走看看