電子商務網站建設的階段化分析b2b電子商務平臺有哪些
目錄
- 參考
- 結構
- PicturePlay.pro
- main.cpp
- pictureplay.h
- pictureplay.cpp
- pictureplay.ui
- 效果
參考
Qt圖片瀏覽器
QT制作一個圖片播放器
Qt中自適應的label+pixmap充滿窗口后,無法縮小只能放大
可以顯示jpg、jpeg、png、bmp。可以從電腦上拖動圖到窗口并顯示出來或者打開文件選擇,定時滾動圖片
重載實現dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口大小改變)
結構
PicturePlay.pro
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \pictureplay.cppHEADERS += \pictureplay.hFORMS += \pictureplay.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \res.qrc
main.cpp
#include "pictureplay.h"#include <QApplication>
#include<QFile>
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 加載樣式文件QFile file(":/style.qss");/*判斷文件是否存在*/if(file.exists()){file.open(QFile::ReadOnly);// 以只讀的方式打開//QString styleSheet=QLatin1String(file.readAll());// 以Latin-1編碼的字符串的方式保存讀出的結果QString styleSheet=QString(file.readAll());// 以默認編碼的字符串的方式保存讀出的結果qApp->setStyleSheet(styleSheet);// 設置全局樣式file.close();// 關閉文件}PicturePlay w;w.show();return a.exec();
}
pictureplay.h
#ifndef PICTUREPLAY_H
#define PICTUREPLAY_H#include <QWidget>
#include <QFile>
#include <QDir>
#include <QTimer>
#include <QThread>
#include <QFileDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class PicturePlay; }
QT_END_NAMESPACEclass PicturePlay : public QWidget
{Q_OBJECTpublic:PicturePlay(QWidget *parent = nullptr);~PicturePlay();
private slots:void myautoPhoto(); //自動播放函數void showDinamicPhoto(QString path);//動態(tài)圖播放(格式為gif)void on_pathBtn_clicked();//瀏覽:打開目錄void on_autoPhoto_clicked(bool checked);//自動播放選擇void on_photoList_clicked(const QModelIndex &index);//單擊播放圖片void my_currentRowChanged(int Row);// // 當前項變化void on_cleanBtn_clicked();//清除private:QString Dir;//打開文件的路徑QString tempDir; //照片的絕地路徑QVector<QString> photoPath;//存放照片相對路徑的容器QTimer *mtime; //定時器QString delayTime; //延時間隔bool autoFlag; //判斷是否進入的自動播放格式int num; //照片張數// 如果文件的后綴名是jpg、jpeg、bmp或png,則接受拖放事件,否則忽略拖放事件QStringList acceptedFileTypes;void dragEnterEvent(QDragEnterEvent *event)override;//拖進事件void dropEvent(QDropEvent *event)override;// 拖進放下事件void resizeEvent(QResizeEvent *event)override;//用于在窗口大小改變時處理事件QPixmap pixmap;
private:Ui::PicturePlay *ui;
};
#endif // PICTUREPLAY_H
pictureplay.cpp
#include "pictureplay.h"
#include "ui_pictureplay.h"
#include<QDebug>
#include<QMessageBox>
#include<QMovie>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
PicturePlay::PicturePlay(QWidget *parent): QWidget(parent), ui(new Ui::PicturePlay)
{ui->setupUi(this);this->setWindowTitle("圖片播放器");this->setWindowIcon(QIcon(":/ImageEye.jpg"));this->setAcceptDrops(true);//設置允許向窗口拖入圖片this->setMinimumSize(QSize(400,300));// 設置最小值ui->photoShow->setAlignment(Qt::AlignCenter); //居中顯示//自適應的label+pixmap充滿窗口后,無法縮小只能放大ui->photoShow->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);// Ignored忽略// 設置拉伸因子(默認縮到最小時失效:一樣大小)ui->horizontalLayout_2->setStretch(1,3);//設置窗口布局,(此時控件會隨窗口縮放)this->setLayout(ui->horizontalLayout_2);// 設置水平布局控件到邊框距離(左,上,右,下)ui->horizontalLayout_2->setContentsMargins(5,0,5,0);ui->photoPath->setFocusPolicy(Qt::NoFocus);//無法獲得焦點,自然無法輸入,其他文本控件類似ui->photoPath->setPlaceholderText("絕對路徑");ui->delayEdit->setPlaceholderText("秒");//不顯示行向滾動條,子項文本過長自動顯示...ui->photoList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);num=0; //照片張數delayTime.clear(); //延時間隔mtime = new QTimer(this);//連接自動播放槽函數connect(mtime,SIGNAL(timeout()),this,SLOT(myautoPhoto()));connect(ui->photoList,SIGNAL(currentRowChanged(int)),this,SLOT(my_currentRowChanged(int)));// 如果文件的后綴名是jpg、jpeg、bmp或png,則接受拖放事件,否則忽略拖放事件acceptedFileTypes.append("jpg");acceptedFileTypes.append("jpeg");acceptedFileTypes.append("bmp");acceptedFileTypes.append("png");acceptedFileTypes.append("gif");
}PicturePlay::~PicturePlay()
{delete ui;
}
//自動播放函數
void PicturePlay::myautoPhoto()
{tempDir.clear();tempDir=photoPath.at(num); //從容器中找到要播放的照片的相對路徑ui->photoList->setCurrentRow(num);// QListWidget項跳動if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif")){showDinamicPhoto(tempDir);num++;}else if(!(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif"))){// 內容是否自動縮放,參數true自動縮放ui->photoShow->setScaledContents(true);//顯示圖片的全部pixmap.load(tempDir);// 更新全局圖片ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖片//判斷自動播放的時候是否播放到了最后一張圖片,如果是則停止自動播放if(num == (photoPath.count()-1)){//qDebug()<<num;if(ui->loopPlayback->checkState()==Qt::Checked)//循環(huán)重放{num = -1;// 下面num++,為了循環(huán)重放回到第一張圖片qDebug()<<num;}else{mtime->stop();num = 0;if(autoFlag)//選中自動播放的情況{autoFlag = false;}//qDebug()<<num;ui->autoPhoto->setCheckState(Qt::Unchecked);//把自動播放按鈕置于沒有選擇的狀態(tài)}}if(autoFlag){num++;}}
}
//動態(tài)圖播放(格式為gif)
void PicturePlay::showDinamicPhoto(QString path)
{QMovie *movie = new QMovie(path); // path圖片路徑movie->start(); //開始播放動態(tài)圖ui->photoShow->setMovie(movie); //將圖片設置為為動態(tài)ui->photoShow->setScaledContents(true); //盡可能完整的播放整張動圖 ,此處要設置為true
}//瀏覽:打開目錄
void PicturePlay::on_pathBtn_clicked()
{Dir = QFileDialog::getExistingDirectory(this);//獲取本文件所在的具體路徑//qDebug()<<"路徑:"<<Dir;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();if(info.fileName() == "." || info.fileName() == "..") //跳過這兩個目錄{continue;}// 檢查文件的后綴名是否在接受的文件類型列表中;(獲取文件的后綴名,并將其轉換為小寫字母)if(!acceptedFileTypes.contains(info.suffix().toLower())){continue;}fileDir+=Dir + "/";QString filename = info.fileName();fileDir+=filename;photoPath.append(fileDir);// 把圖片的路徑裝到容器中QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件縮小圖標item->setToolTip(info.fileName());// tip提示item->setTextAlignment(Qt::AlignCenter);//設置item項中的文字位置ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中}if(ui->photoList->count()==0){QListWidgetItem *item = new QListWidgetItem("無合適圖片");item->setTextAlignment(Qt::AlignCenter);//設置item項中的文字位置ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中}
}//自動播放選擇
void PicturePlay::on_autoPhoto_clicked(bool checked)
{if(ui->delayEdit->text().isEmpty()){QMessageBox::warning(this,"提示","請輸入需要間隔的播放時間(秒)");//把按鈕重新置于沒有被選中的狀態(tài);不要用setCheckable()函數[不可用],很容易出錯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);//啟動定時器并設置播放時間間隔autoFlag = true;// 選中自動播放}else if(!checked)//停止定時器{mtime->stop();//停止定時器delayTime.clear();autoFlag = false;}
}//單擊播放圖片
void PicturePlay::on_photoList_clicked(const QModelIndex &index)
{qDebug()<<"單擊播放圖片";Q_UNUSED(index);//忽略編譯器發(fā)出的警告,表明變量event未使用//如果選中了自動播放的情況下,點擊列表中的內容,則停止自動播放if(autoFlag) //選中自動播放的情況{mtime->stop();//把按鈕重新置于沒有被選中的狀態(tài);不要用setCheckable()函數[不可用],很容易出錯ui->autoPhoto->setCheckState(Qt::Unchecked);autoFlag = false;}num = ui->photoList->row(ui->photoList->currentItem()); //獲取當前點擊的內容的行號//在沒有選中自動播放的情況下,判斷當前是否點擊了最后一張照片,如果是最后一張照片,在選中自動播放的情況下讓它返回到第一張照片if(!autoFlag&&num == ui->photoList->count()){num = 0;}tempDir.clear();/*tempDir+=Dir+"/";QString path = ui->photoList->currentItem()->text();tempDir+=path*/;tempDir=photoPath.at(num); //從容器中找到要播放的照片的相對路徑//判斷是否是動態(tài)圖;endsWith()字符串結尾if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif")){showDinamicPhoto(tempDir);}else{// 內容是否自動縮放,參數true自動縮放ui->photoShow->setScaledContents(true);//顯示圖片的全部pixmap.load(tempDir);// 更新全局圖片ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖片}
}
// 當前項變化
void PicturePlay::my_currentRowChanged(int Row)
{qDebug()<<"當前項變化:"<<Row;
}
//拖進事件
void PicturePlay::dragEnterEvent(QDragEnterEvent *event)
{// 用于檢查拖放的數據是否包含URL,并且獲取拖放事件中的URL數量==1if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){// 獲取拖放事件中的第一個URL的本地文件路徑QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());// 檢查文件的后綴名是否在接受的文件類型列表中;(獲取文件的后綴名,并將其轉換為小寫字母)if(acceptedFileTypes.contains(file.suffix().toLower())){event->acceptProposedAction();//表明用戶可以在窗口部件上拖放對象[接受拖放事件的操作]}}
}
// 拖進放下事件
void PicturePlay::dropEvent(QDropEvent *event)
{// 獲取拖放事件中的第一個URL的本地文件路徑QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());//qDebug()<<"絕對路徑:"<<file.absoluteFilePath();//從文件中加載圖片,參數file.absoluteFilePath()表示包含文件名的絕對路徑,load()返回一個bool值,表示是否加載成功if(pixmap.load(file.absoluteFilePath())){// 將圖片縮放到指定大小,參數ui->label->size()表示縮放的大小,Qt::KeepAspectRatio表示保持圖片的寬高比,Qt::SmoothTransformation表示使用平滑縮放算法ui->photoShow->setPixmap(pixmap.scaled(ui->photoShow->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));ui->photoPath->setText(file.absolutePath());//顯示打開的文件的絕對路徑,這不包括文件名。photoPath.append(file.absoluteFilePath());// 把圖片的路徑裝到容器中QListWidgetItem *item = new QListWidgetItem(QIcon(file.absoluteFilePath()),file.fileName());//建立文件縮小圖標item->setToolTip(file.fileName());// tip提示item->setTextAlignment(Qt::AlignCenter);//設置item項中的文字位置ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中}else{// 錯誤消息框QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));}
}
//用于在窗口大小改變時處理事件
int i=0;
void PicturePlay::resizeEvent(QResizeEvent *event)
{Q_UNUSED(event);//忽略編譯器發(fā)出的警告,表明變量event未使用qDebug()<<"窗口大小改變:"<<i++;if(!pixmap.isNull()){ui->photoShow->setPixmap(pixmap.scaled(ui->photoShow->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));}
}
// 清除
void PicturePlay::on_cleanBtn_clicked()
{mtime->stop();num = 0;if(autoFlag)//選中自動播放的情況{autoFlag = false;}pixmap.fill(Qt::transparent);//函數用于將QPixmap對象pixmap清空,參數Qt::transparent表示填充透明色,無返回值ui->autoPhoto->setCheckState(Qt::Unchecked);//把自動播放按鈕置于沒有選擇的狀態(tài)ui->loopPlayback->setCheckState(Qt::Unchecked);//把循環(huán)重放鈕置于沒有選擇的狀態(tài)photoPath.clear();ui->photoPath->clear();ui->photoShow->clear();ui->photoList->clear();
}
pictureplay.ui
效果
- 啟動
- 運行