這幾天一直在忙着做一個圖檔浏覽器,花費了很多的時間去調試,最終實作結果和win7自帶的圖檔浏覽器基本功能差不多,主要工作在QLabel與圖檔的大小變化還有翻轉的時候大小變化的問題,問題很多,但是都解決了,先看一個作品吧。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiM2gTNygTN0EDMxMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
主要思路就是添加action,給action注冊事件,然後在那些前一頁,後一頁,順時針翻轉。逆時針翻轉等的函數中寫算法,控制圖檔動作。
1.接下來是主要的幾個函數,先是open:
void PictureBrowsing::on_actionOpen_O_triggered() {
int g, k;
filename = QFileDialog::getOpenFileName(this, tr("Select image:"),".", tr("Images (*.png *.bmp *.jpg *.gif)"));
if (filename.isEmpty())
return;
if (!image.load(filename)) {
QMessageBox::information(this, tr("Error"), tr("Open file error"));
return;
}
getImInfoList();
imageShow();
setWindowTitle(QFileInfo(filename).fileName()+tr("-imageViewer"));
}
2.其中的imageShow()函數(注意,後面也會用到這個自定義的函數)
void PictureBrowsing::imageShow()
{
QPixmap pixmap = QPixmap::fromImage(image);
pixmap = pixmap.scaled(ui.centralWidget->width() - 50, ui.centralWidget->height() - 50, Qt::KeepAspectRatio);
pix = pixmap;//全局pix
QSize imagesize = pixmap.size();
ui.imageLabel->resize(imagesize);//重新調整label大小以适應圖檔大小
ui.imageLabel->setPixmap(pixmap);
}
3.其中的getImInfoList()函數(此函數主要是将一個檔案夾中的所有圖檔格式的路徑指針存儲到一個數組imgInfoList中,以便在按下前一頁,或者後一頁時,取出數組中指針對應的圖檔)
void PictureBrowsing::getImInfoList() {
imgInfoList.clear();
path = QFileInfo(filename).absolutePath();
QDir dir = QFileInfo(filename).absoluteDir();
QFileInfoList infoList = dir.entryInfoList(QDir::Files);
QFileInfo info;
for (int i = 0; i < infoList.count(); i++) {
info = infoList.at(i);
QString suffix = info.suffix();
if (suffix == "jpg" || suffix == "bmp" || suffix == "png") {
imgInfoList.append(info);
}
}
QFileInfo curImageInfo = QFileInfo(filename);
for (int j = 0; j < imgInfoList.count(); j++) {
info = imgInfoList.at(j);
if (info.fileName() == curImageInfo.fileName()) {
index = j;
}
}
}
4.“上一張”按鈕
void PictureBrowsing::on_actionPrevious_P_triggered()
{
index = index - 1;
int count = imgInfoList.count();
if (index == -1)
index = count - 1;
filename.clear();
filename.append(path);
filename += "/";
filename += imgInfoList.at(index).fileName();
//QImage image;
if (!image.load(filename)) {
QMessageBox::information(this,tr("Error"),tr("Open file error"));
return;
}
imageShow();
setWindowTitle(QFileInfo(filename).fileName() + tr("-imageViewer"));
}
5.“下一張”按鈕
void PictureBrowsing::on_actionNext_N_triggered()
{
index = index + 1;
int count = imgInfoList.count();
if (index == count) {
index = 0;
}
filename.clear();
filename.append(path);
filename += "/";
filename += imgInfoList.at(index).fileName();
if (!image.load(filename)) {
QMessageBox::information(this,tr("Error"),tr("Open file Error"));
return;
}
imageShow();
setWindowTitle(QFileInfo(filename).fileName() + tr("-imageViewer"));
}
6.順時針旋轉
void PictureBrowsing::on_actionClockWise_C_triggered()
{
QMatrix matrix;
QPixmap pixmap;
imageAngle += 1;
imageAngle = imageAngle % 4;
matrix.rotate(imageAngle*90);
image.load(filename);
image = image.transformed(matrix);
imageShow();
}
7.逆時針旋轉
void PictureBrowsing::on_actionAntiClockWise_A_triggered()
{
//QImage imgRotate;
QMatrix matrix;
QPixmap pixmap;
//QImage image;
imageAngle += 3;
imageAngle = imageAngle % 4;
matrix.rotate(imageAngle * 90);
image.load(filename);
//imgRotate = image.transformed(matrix);
image = image.transformed(matrix);
imageShow();
}
8.放大
void PictureBrowsing::on_actionZooming_Out_O_triggered()
{
QMatrix matrix;
QPixmap pixmap;
image.load(filename);
matrix.rotate(imageAngle * 90);
image = image.transformed(matrix);
pixmap = QPixmap::fromImage(image);
pixmap = pixmap.scaled(pix.width()*1.2, pix.height()*1.2, Qt::KeepAspectRatio);
pix = pix.scaled(pix.width()*1.2, pix.height()*1.2, Qt::KeepAspectRatio);
QSize imagesize = pixmap.size();
ui.imageLabel->setPixmap(pixmap);
}
9.縮小
void PictureBrowsing::on_actionZooming_in_I_triggered()
{
QMatrix matrix;
QPixmap pixmap;
image.load(filename);
matrix.rotate(imageAngle * 90);
image = image.transformed(matrix);
pixmap = QPixmap::fromImage(image);
pixmap = pixmap.scaled(pix.width()*0.8, pix.height()*0.8, Qt::KeepAspectRatio);
pix = pix.scaled(pix.width()*0.8, pix.height()*0.8, Qt::KeepAspectRatio);
QSize imagesize = pixmap.size();
ui.imageLabel->setPixmap(pixmap);
}
好了,鑒于時間原因,我把源代碼都放上去了,如果有需要全部代碼的,可以到這裡下載下傳,注意,我是用Qt+VS,用Qt Creator也可以參考,
謝謝大家!我的表演結束!