1. 程式人生 > >QT筆記(6)——Qt開啟檔案與儲存檔案

QT筆記(6)——Qt開啟檔案與儲存檔案

Qt開啟檔案與儲存檔案,首先開啟檔案,qt給了一個方法直接呼叫就好,如下:

static QString getOpenFileName(QWidget *parent = Q_NULLPTR,
                                   const QString &caption = QString(),
                                   const QString &dir = QString(),
                                   const QString &filter = QString(),
                                   QString *selectedFilter = Q_NULLPTR,
                                   Options options = Options());
通用解釋如下:

第一個引數parent,用於指定父元件。注意,很多Qt元件的建構函式都會有這麼一個parent引數,並提供一個預設值0; 
第二個引數caption,是對話方塊的標題; 
第三個引數dir,是對話方塊顯示時預設開啟的目錄,"." 代表程式執行目錄,"/" 代表當前碟符的根目錄(Windows,Linux下/就是根目錄了),也可以是平臺相關的,比如"C:\\"等; 
第四個引數filter,是對話方塊的字尾名過濾器,比如我們使用"Image Files(*.jpg *.png)"就讓它只能顯示字尾名是jpg或者png的檔案。如果需要使用多個過濾器,使用";;"分割,比如"JPEG Files(*.jpg);;PNG Files(*.png)"; 
第五個引數selectedFilter,是預設選擇的過濾器; 
第六個引數options,是對話方塊的一些引數設定,比如只顯示資料夾等等,它的取值是enum QFileDialog::Option,每個選項可以使用 | 運算組合起來。
下面以工程例項具體說開啟檔案和儲存檔案具體操作,工程是載入一個圖片到label中,在將圖片改名儲存到指定資料夾中,具體操作如下:

1.新建一個mainwindow工程,在ui裡新增一個label,格柵佈局;


2.在選單欄中新增檔案》開啟,儲存,如下:


3.編輯動作,新增槽,如下:


4.轉到槽進行編輯,如下:


5.轉到槽,選擇訊號型別:


6.程式碼如下,mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QImage>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    int globalMark;//儲存標記用
    QImage globalImg;//儲存圖片用

private slots:
    void on_ac_openfile_triggered();
    void on_ac_save_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QFileDialog>
#include <QDebug>
#include <QTime>
#include <QDir>
#include <QFile>

#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    globalMark=0;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_ac_openfile_triggered()
{
   ui->label->clear();//先清除label內容
    //開啟圖片操作
    QString fileName = QFileDialog::getOpenFileName(
                this, tr("open image file"),
                "./", tr("Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*.*)"));

    if(fileName.isEmpty())
    {
        QMessageBox mesg;
        mesg.warning(this,"警告","開啟圖片失敗!");
        return;
    }
    else
    {
        QImage img(fileName);
        img=img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);//Qt::KeepAspectRatio自適應大小,不變形
        ui->label->setPixmap(QPixmap::fromImage(img));
        if(img.isNull())
        {
            QMessageBox::information(this,"資訊","開啟檔案失敗");
        }
        else
        {
            globalMark=1;//儲存標記,用於判斷是否有檔案
            globalImg=img;
        }
    }
}

void MainWindow::on_ac_save_triggered()
{
    if( globalMark==1)//r如果標記為1,證明有檔案載入,不然沒有不需要儲存
    {
        QString dirPath;//建立資料夾路徑
        QString filePath;//儲存儲存路徑
        QString saveName="儲存實驗圖";//儲存圖片名字
        QDateTime time = QDateTime::currentDateTime();//獲取系統現在的時間
        QString str = time.toString("yyyyMMdd_hhmmss"); //設定顯示格式
        filePath = QFileDialog::getExistingDirectory(this,"");//獲取資料夾路徑
        if(filePath.isEmpty())
        {
            QMessageBox::information(this,"資訊","儲存失敗");
        }
        else
        {
            dirPath=QString("%1/儲存實驗%2").arg(filePath).arg(str);
            QDir *temp = new QDir;//宣告檔案物件
            temp->mkdir(dirPath);//建立資料夾
            QImage images;
            images=globalImg;//獲取載入圖片

            //將圖片重新命名並儲存至剛剛建立的資料夾裡
            QString savePath=QString("%1//%2.jpg").arg(dirPath).arg(saveName);
            images.save(savePath);//QImage儲存方法
            QMessageBox::information(this,"資訊","儲存成功");
        }
    }
    else
    {
        QMessageBox::information(this,"資訊","儲存失敗");
    }
}

效果如下: