基于Qt實現(xiàn)圖片播放器的示例代碼
前言:使用qt制作了一個簡單的圖片播放器,可以播放gif、png等格式圖片
先來看看播放器的功能(當(dāng)然是很簡陋的,沒有很深入的設(shè)計):
1、點擊圖片列表中圖片進(jìn)行播放。
2、自動播放,播放的圖片的間隔時間可以自己設(shè)定,時間的單位是秒。
3、自動播放的時候再點擊圖片列表會停止自動播放,保存當(dāng)前播放的圖片的順序,再次點擊自動播放的時候?qū)漠?dāng)前開始。
4、自動播放到最后一張圖片的時候?qū)V棺詣硬シ?,再次點擊自動播放的時候?qū)牡谝粡垐D片開始。
先上圖看看具體功能:
說完功能我們聊聊制作思路和使用到的主要代碼:
1、打開有圖片的文件,并獲取文件的路徑
Dir = QFileDialog::getExistingDirectory(this);//獲取文件所在的具體路徑
2、把文件的路徑顯示在指定的窗口
ui->photoPath->setText(Dir);//顯示打開的文件的具體路徑
3、列出文件中的圖片的路徑,建立小圖標(biāo),并把圖片路徑保存到容器中,方便自動播放
//列出目錄下的文件 for(int i=0;i<fileList.count();i++) { QFileInfo info = fileList.at(i); fileDir.clear(); fileDir.append(Dir + "/"); QString filename = info.fileName(); fileDir.append(filename); photoPath.append(filename);// 把圖片的路徑保存到容器中 if(info.fileName() == "." || info.fileName() == "..") //跳過這兩個目錄 { continue; } QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件縮小圖標(biāo) ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中 }
4、單擊圖片列表中的圖片進(jìn)行播放(圖片播放的代碼)
tempDir.clear(); tempDir.append(Dir+"/"); QString path = ui->photoList->currentItem()->text(); tempDir.append(path); ui->photoShow->setScaledContents(true);//顯示圖片的全部 ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖
5、動態(tài)圖播放
//播放動態(tài)圖 void MainWindow::showDinamicPhoto(QString path) { QMovie *movie = new QMovie(path); // path圖片路徑 movie->start(); //開始播放動態(tài)圖 ui->photoShow->setMovie(movie); //將圖片設(shè)置為為動態(tài) ui->photoShow->setScaledContents(true); //盡可能完整的播放整張動圖 ,此處要設(shè)置為true }
6、自動播放,這里的自動播放我使用了定時器實現(xiàn)
else if(checked) //啟動定時器 { delayTime = ui->delayEdit->text(); mtime->start(delayTime.toInt()*1000);//啟動定時器并設(shè)置播放時間間隔 autoFlag = true; ui->autoPhoto->setCheckState(Qt::Unchecked); } else if(!checked)//停止定時器 { mtime->stop();//停止定時器 delayTime.clear(); autoFlag = false; }
7、設(shè)置自動播按鈕的狀態(tài)
ui->autoPhoto->setCheckState(Qt::Unchecked); //把按鈕重新置于沒有被選中的狀態(tài)
這里切記要這樣使用,不要用setCheckable()函數(shù),很容易出錯
具體代碼如下:
頭文件mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QFile> #include <QDir> #include <QTimer> #include <QThread> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pathBt_clicked(); //打開目錄 void on_photoList_clicked(const QModelIndex &index);//單擊播放圖片 void on_autoPhoto_clicked(bool checked);//自動播放選擇 void autoPhoto(); //自動播放函數(shù) void showDinamicPhoto(QString path);//動態(tài)圖播放(格式為gif) private: Ui::MainWindow *ui; QFile *file; QString Dir;//打開文件的路徑 QString tempDir; //照片的絕地路徑 QVector<QString> photoPath;//存放照片相對路徑的容器 QTimer *mtime; //定時器 QString delayTime; //延時間隔 bool autoFlag; //判斷是否進(jìn)入的自動播放格式 int num; //照片張數(shù) }; #endif // MAINWINDOW_H
源文件mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QDebug> #include <QMessageBox> #include <QMovie> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), autoFlag(false), ui(new Ui::MainWindow) { ui->setupUi(this); num = 0; delayTime.clear(); mtime = new QTimer(); //連接自動播放槽函數(shù) connect(mtime,SIGNAL(timeout()),this,SLOT(autoPhoto())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pathBt_clicked() { Dir = QFileDialog::getExistingDirectory(this);//獲取文件所在的具體路徑 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(); fileDir.append(Dir + "/"); QString filename = info.fileName(); fileDir.append(filename); photoPath.append(filename);// 把圖片的路徑裝到容器中 if(info.fileName() == "." || info.fileName() == "..") //跳過這兩個目錄 { continue; } QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件縮小圖標(biāo) ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中 } // qDebug()<<ui->photoList->count(); } //單擊圖片列表中的圖片進(jìn)行播放,如果當(dāng)前 void MainWindow::on_photoList_clicked(const QModelIndex &index) { //如果選中了自動播放的情況下,點擊列表中的內(nèi)容,則停止自動播放 if(autoFlag) //選中自動播放的情況 { mtime->stop(); ui->autoPhoto->setCheckState(Qt::Unchecked); autoFlag = false; } num = ui->photoList->row(ui->photoList->currentItem()); //獲取當(dāng)前點擊的內(nèi)容的行號 //在沒有選中自動播放的情況下,判斷當(dāng)前是否點擊了最后一張照片,如果是最后一張照片,在選中自動播放的情況下讓它返回到第一張照片 if(!autoFlag) { num == ui->photoList->count(); num = 0; } tempDir.clear(); tempDir.append(Dir+"/"); QString path = ui->photoList->currentItem()->text(); tempDir.append(path); //判斷是否是動態(tài)圖 if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif")) { showDinamicPhoto(tempDir); } else { ui->photoShow->setScaledContents(true);//顯示圖片的全部 ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖片 } } //自動播放照片 void MainWindow::on_autoPhoto_clicked(bool checked) { if(ui->delayEdit->text().isEmpty()) { QMessageBox::warning(this,"提示","請輸入需要間隔的播放時間(秒)"); ui->autoPhoto->setCheckState(Qt::Unchecked); return; } else if(ui->photoList->count() == 0) { QMessageBox::warning(this,"警告","還沒有可以播放的圖片"); ui->autoPhoto->setCheckState(Qt::Unchecked); //把按鈕重新置于沒有被選中的狀態(tài) return; } else if(checked) //啟動定時器 { delayTime = ui->delayEdit->text(); mtime->start(delayTime.toInt()*1000);//啟動定時器并設(shè)置播放時間間隔 autoFlag = true; //ui->autoPhoto->setCheckState(Qt::Unchecked); } else if(!checked)//停止定時器 { mtime->stop();//停止定時器 delayTime.clear(); autoFlag = false; } } void MainWindow::autoPhoto() { //int tempCount=0; //tempCount = photoPath.count(); tempDir.clear(); tempDir.append(Dir+"/"); QString path = photoPath.at(num); //從容器中找到要播放的照片的相對路徑 tempDir.append(path); //拼接照片的絕對路徑 if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif")) { showDinamicPhoto(tempDir); num++; } else if(!(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif"))) { ui->photoShow->setScaledContents(true);//顯示圖片的全部 ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖片 //判斷自動播放的時候是否播放到了最后一張圖片,如果是則停止自動播放 if(num == (photoPath.count()-1)) { qDebug()<<num; mtime->stop(); num = 0; if(autoFlag) { autoFlag = false; } qDebug()<<num; ui->autoPhoto->setCheckState(Qt::Unchecked);//把自動播放按鈕置于沒有選擇的狀態(tài) } if(autoFlag) { num++; } } } //播放動態(tài)圖 void MainWindow::showDinamicPhoto(QString path) { QMovie *movie = new QMovie(path); // path圖片路徑 movie->start(); //開始播放動態(tài)圖 ui->photoShow->setMovie(movie); //將圖片設(shè)置為為動態(tài) ui->photoShow->setScaledContents(true); //盡可能完整的播放整張動圖 ,此處要設(shè)置為true }
界面文件mainwindow.ui
View Code
具體界面如下
到此這篇關(guān)于基于Qt實現(xiàn)圖片播放器的示例代碼的文章就介紹到這了,更多相關(guān)Qt圖片播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++高并發(fā)內(nèi)存池的整體設(shè)計和實現(xiàn)思路
這篇文章主要介紹了C++高并發(fā)內(nèi)存池的整體設(shè)計和實現(xiàn)思路詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實現(xiàn)的相關(guān)資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析
以下是對全局變量與局部變量在內(nèi)存中的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10