Qt之图片定时自动播放

孤街浪徒 提交于 2019-12-22 00:48:25

Qt实现图片定时播放

Qt之图片定时自动播放

因为实习工作涉及到这个,功能就是qt这边播放图片,五秒播一张图片,然后空白一秒,再播放下一张图片,有开始暂停按钮

定时器

当时找了很多示例定时器都不能做到想要的效果,后来还是看Qt自带的示例做出来了

/* 定时器事件  */
void MainWindow::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == timer.timerId())
    {
        timer_clear.stop();
        timer.stop();
        PhotoClear();
        timer_clear.start(1000,this);

    }
    else if(event->timerId() == timer_clear.timerId())
    {
        timer.stop();
        timer_clear.stop();

        m_ifmatch_ = 0;
        ShowTestingImg();

    }
    else
    {
        QWidget::timerEvent(event);
    }

}

然后就是显示图片的部分,这里做了函数模块的分工

/*获测试集图片文件的路径*/
QStringList MainWindow::GetFilesPath()
{
    QStringList filter ;
    testingfilePath = QFileDialog::getExistingDirectory(this, "choose src Directory","/");
    if(testingfilePath.length() == 0)
    {
        QMessageBox mesg;
        mesg.warning(this,"error","未选择图片库/已取消");
        return filter;
    }
    qDebug()<<"testingfilePath''''"<<testingfilePath;
    QDir dir(testingfilePath);
    //QDir *dir = new QDir(testingfilePath);

    QList<QFileInfo>*fileInfo = new QList<QFileInfo>(dir.entryInfoList(filter));
    for(int i = 0;i<fileInfo->count(); i++)
        {
            if(fileInfo->at(i).fileName()== "." ||fileInfo->at(i).fileName()== ".." )
            {
                continue;
            }
            auto file = fileInfo->at(i);
            if(file.isDir()){
                DIRflag = TYPE_DIR;
                /*当文件夹中是文件夹时*/
                files_jia.append(file.filePath());
            }
            else
            {
                DIRflag = TYPE_FLODER;
                /*当文件夹中全是图片时*/
                files_picname.append(file.fileName());
            }
        }
    if(DIRflag == TYPE_DIR && (files_index <files_jia.count()))
    {
        QDir dir(files_jia.at(files_index));
        QStringList nameFilters;
        QStringList list_path  = dir.entryList(QDir::Dirs,QDir::Name);
        nameFilters << "*.jpg";

        files_jia_pic = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
        testingfilePath = files_jia.at(files_index);

//        if(files_index<files_jia.count())
//        {
//            files_index++;
//        }

        return files_jia_pic;

    }
    else if (DIRflag == TYPE_FLODER)
    {
        //qDebug()<<"files_picname"<<files_picname;
        return files_picname;
    }

}

因为工作要求的原因,当时要求要区分开选择的一个一级图片路径还是路径下有不同的文件夹,文件夹中有图片的情况
播放的时候如果全是图片就直接播放,如果是文件夹的情况,就按照文件夹顺序播放

/*  导入测试集图片 */
void MainWindow::MultiImgToTesting()
{
    ui->lb_play_stop->setText("开始");
    files.clear();
    files = GetFilesPath();
    if(files.count() == 0)
    {
        return;
    }
    fileCount = 0;
}

/*  显示测试集图片 */
void MainWindow::ShowTestingImg()
{
    if(DIRflag == TYPE_DIR)
    {
        auto Testfilename_ = files_jia.at(files_index);
        QStringList result_map = Testfilename_.split("/");
        filename_map = result_map.at(result_map.size()-1);

        //qDebug()<<"filename_map"<<filename_map;
        //qDebug()<<"pre_filename_map"<<pre_filename_map;
        if(pre_filename_map == filename_map)
        {
            filename_reslut_map[filename_map]=m_struct_result;
        }
        else {
            m_struct_result.in_fail = 0;
            m_struct_result.in_error = 0;
            m_struct_result.in_success = 0;
            m_struct_result.out_fail = 0;
            m_struct_result.out_error = 0;
            m_struct_result.num = 0;
        }
         pre_filename_map = filename_map;
         //qDebug()<<"enenenenenen"<<filename_map;
    }
    //显示下一个文件夹图片
    if(DIRflag == TYPE_DIR && (files.size() <= fileCount))
    {
        if(files_jia.count()-files_index > 1)
        {

            files_index++;
            QDir dir(files_jia.at(files_index));
            QStringList nameFilters;
            QStringList list_path  = dir.entryList(QDir::Dirs,QDir::Name);
            nameFilters << "*.jpg";

            files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
            testingfilePath = files_jia.at(files_index);
//            if(files_index<files_jia.count())
//            {
//                files_index++;
//            }
            fileCount=0;
            return ShowTestingImg();
        }
        else {
            return;
        }
       
    }

    if(files.size() <= fileCount){
        return;
    }
    ui->lb_faceimage->setScaledContents(true);
    m_file_cur_ = files[fileCount++];


    QImage img;
    img.load(testingfilePath+"/"+m_file_cur_);
    m_fileCount_++;
    m_struct_result.num++;
    //qDebug()<<"播放图片总数 "<<m_fileCount_;
    QPixmap pixmap = QPixmap::fromImage(img);
    QPixmap fitpixmap=pixmap.scaled(ui->lb_faceimage->width(), ui->lb_faceimage->height(),
                                        Qt::KeepAspectRatio, Qt::FastTransformation);

    ui->lb_faceimage->setPixmap(fitpixmap);
    ui->lb_faceimage->setPixmap(pixmap);
    ui->lb_testimgload->setText(QString::number(fileCount)+"/"+QString::number(files.size()));

    if(timer.isActive()){
        timer.stop();
    }
      timer.start(5000, this);
}

中间有些和map相关的代码可以直接删掉,那是工作的部分内容

然后是图片空白部分,暂停播放

/*  图片空白一秒时间  */
void MainWindow::PhotoClear()
{
   
    ui->lb_faceimage->clear();

    if(timer_clear.isActive()){
        timer_clear.stop();
    }
    timer_clear.start(1000, this);

}
/*  暂停·播放 */
void MainWindow::Autoplay_stop()
{
    if(files.size() <= 0)
    {
        QMessageBox mesg;
        mesg.warning(this,"error","请先选择测试集图片");
        return;
    }
    QString str = ui->lb_play_stop->text();
    if(str == "开始")
    {
        ui->lb_play_stop->setText("暂停");
        ShowTestingImg();
    }
    else
    {
        ui->lb_play_stop->setText("开始");
        if(timer.isActive()){
            timer.stop();
        }
        if(timer_clear.isActive()){
            timer_clear.stop();
        }
    }
}

撤 控件的话就两个,一个批量导入播放集,一个开始按钮,点击批量导入播放集选择播放的文件就进入MultiImgToTesting模块,然后点击播放进入Autoplay_stop,就可以自动播放了图片了

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!