QT實戰之實現圖片瀏覽系統
引言
本系統支持,自動播放,左右拖動切換,點擊列表切換,點擊按鈕切換;是一個標準的圖像瀏覽軟件。
Windows 圖片瀏覽器,可以查看當前文件夾下的圖片,往上翻、往下翻並且自動播放;
此系統增加一個列表;
實現功能
1.瀏覽電腦裡的文件夾,將當前文件夾下的圖片列表羅列出來;
2.鼠標點擊列表上的某一張圖片,圖片將顯示出來;
3.可以控制瀏覽當前圖片的上一張和下一張;
4.實現鼠標拖動圖片,左劃,右劃切換圖片;
5.實現自動播放的開始和停止控制。
效果
實現圖片瀏覽所用知識
包括窗口部件、佈局、事件、對象模型與容器類、圖形視圖、模型/視圖編程以及多線程等。
實現流程
1.定義一個圖片類,該類包含圖片的路徑、文件名、文件id以及獲取這些變量的函數。
2. 主要包含添加圖像以及獲取所有圖像以及新加入圖像的函數。
3.最後通過將圖片名字加入到界面左側QDockWidget部件中的QTreeView中,
4.通過雙擊可查看完整圖片,以及通過滾輪和鼠標等事件來對圖片進行一些操作。
實現環境和UI設計
環境:VS2017 + Qt5.12.4
具體實現
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QListWidget> #include <QMainWindow> #include <QTimer> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_btnOpen_clicked(); void on_listWidget_itemClicked(QListWidgetItem *item); void MyFunction(); void on_pushButton_clicked(); void on_btnLast_clicked(); void on_btnNext_clicked(); protected: bool eventFilter(QObject *watch, QEvent *evn); QStringList getFileNames(const QString &path); private: Ui::MainWindow *ui; QVector<QString> mListPath; QTimer mTimer; int index ; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileInfoList> #include <QString> #include <QDir> #include <QMessageBox> #include <QImage> #include "qevent.h" #include <QDebug> #pragma execution_character_set("utf-8") MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); index =0; mTimer.setInterval(1000); connect(&mTimer,SIGNAL(timeout()),this,SLOT(MyFunction())); on_btnOpen_clicked(); mTimer.start(1000); ui->btnOpen->setVisible(false); // ui->pushButton->setVisible(false); this->installEventFilter(this); this->setWindowTitle("圖片瀏覽器"); } MainWindow::~MainWindow() { delete ui; } void MainWindow::MyFunction() { if (index == 5) { index = 0; } else { index++; } if (index == 5) { index = 0; } // this->setStyleSheet(QString("background-image: url(:/%1.png);").arg(index)); QString strIndex = mListPath.at(index); qDebug()<<"index "<<QString::number(index)<<"strIndex "<<strIndex; QDir filePath(ui->inputDirPath->text()); QString fullName = filePath.absoluteFilePath(strIndex); QImage img(fullName); QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio); ui->label->setPixmap(QPixmap::fromImage(thumb)); } void MainWindow::on_btnOpen_clicked() { QString filePath = QCoreApplication::applicationDirPath()+"/pic"; ui->inputDirPath->setText(filePath); // QMessageBox::information(this,"提示!",filePath); QDir dir(filePath); // 判斷文件夾是否存在 if(dir.exists()){ ui->listWidget->clear(); QFileInfoList info_list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); for(int i =0;i<info_list.count();i++){ ui->listWidget->addItem(info_list.at(i).fileName()); mListPath.push_back(info_list.at(i).fileName()); } } else{ QMessageBox::information(this,"提示!","文件夾不存在"); } } QStringList MainWindow::getFileNames(const QString &path) { QDir dir(path); QStringList nameFilters; nameFilters << "*.jpg" << "*.png"; QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name); return files; } void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item) { if(mTimer.isActive()) mTimer.stop(); QDir filePath(ui->inputDirPath->text()); QString fullName = filePath.absoluteFilePath(item->text()); QImage img(fullName); QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio); ui->label->setPixmap(QPixmap::fromImage(thumb)); } //點擊事件函數 bool MainWindow::eventFilter(QObject *watch, QEvent *evn) { static int press_x; //點擊鼠標時獲取的橫坐標x static int press_y; //點擊鼠標時獲取的縱坐標y static int relea_x; //松開鼠標時獲取的橫坐標x static int relea_y; //松開鼠標時獲取的縱坐標y QMouseEvent *event = static_cast<QMouseEvent *>(evn); //將圖片QT QEvent 轉換為 QMouseEvent ,QKeyEvent....等子類 //獲取點擊鼠標(手指)時的坐標 if (event->type() == QEvent::MouseButtonPress) { press_x = event->globalX(); press_y = event->globalY(); } //獲取松開鼠標(手指)時的坐標 if(event->type() == QEvent::MouseButtonRelease) { relea_x = event->globalX(); relea_y = event->globalY(); } //對鼠標(手指)滑動的方向進行判斷(右滑) if((relea_x - press_x) > 5 && event->type() == QEvent::MouseButtonRelease && qAbs(relea_y - press_y) < 50) { on_btnNext_clicked(); } if( event->type() == QEvent::MouseButtonRelease) qDebug()<<"releax "<<QString::number(press_x - relea_x)<<"releay "<<QString::number(relea_y - press_y); //對鼠標(手指)滑動的方向進行判斷(左滑) if((press_x - relea_x) > 5 && event->type() == QEvent::MouseButtonRelease && qAbs(relea_y - press_y) < 50) { on_btnLast_clicked(); } return QWidget::eventFilter(watch, evn); } void MainWindow::on_pushButton_clicked() { if(ui->pushButton->text()=="滑動切換") { ui->pushButton->setText("自動播放"); if(mTimer.isActive()) mTimer.stop(); } else { ui->pushButton->setText("滑動切換"); if(!mTimer.isActive()) mTimer.start(); } } void MainWindow::on_btnLast_clicked() { if(index == -1) { index = 4; } else { index--; } if(index == -1) { index = 4; } // this->setStyleSheet(QString("background-image: url(:/%1.png);").arg(index)); QString strIndex = mListPath.at(index); qDebug()<<"index 111"<<QString::number(index)<<"strIndex "<<strIndex; QDir filePath(ui->inputDirPath->text()); QString fullName = filePath.absoluteFilePath(strIndex); QImage img(fullName); QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio); ui->label->setPixmap(QPixmap::fromImage(thumb)); } void MainWindow::on_btnNext_clicked() { if (index == 5) { index = 0; } else { index++; } if (index == 5) { index = 0; } // this->setStyleSheet(QString("background-image: url(:/%1.png);").arg(index)); //切換圖片 QString strIndex = mListPath.at(index); qDebug()<<"index "<<QString::number(index)<<"strIndex "<<strIndex; QDir filePath(ui->inputDirPath->text()); QString fullName = filePath.absoluteFilePath(strIndex); QImage img(fullName); QImage thumb = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio); ui->label->setPixmap(QPixmap::fromImage(thumb)); }
到此這篇關於QT實戰之實現圖片瀏覽系統的文章就介紹到這瞭,更多相關QT圖片瀏覽系統內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- QT設計秒表功能(跑步計時器)
- QT實現二、八、十六進制之間的轉換
- C/C++ Qt Dialog 對話框組件應用技巧
- Qt事件過濾實現點擊圖片的放大和縮小
- C/C++ Qt StringListModel 字符串列表映射組件詳解