Turn On Blog

ぺーぺーSEの色々メモ

【Qt】スクリーンショット作成アプリケーションを製作する no.3 現在日時をもとにファイル名を生成する

no.1 : 【Qt】スクリーンショット作成アプリケーションを製作する その1 - TRN
no.2 : 【Qt】スクリーンショット作成アプリケーションを製作する no.2 - TRN

今回やること

今回はファイル名の生成部分についてです。
QDateTimeクラスを使って、現在時刻をもとにファイル名を自動生成します。

つくるもの

  • Save
    • 保存にまつわること、すなわちファイル名や時刻取得などする

Save

責務
  • 画像を受け取り、ファイルへ保存する
  • ファイル名を生成する
Save.h
#ifndef SAVE_H
#define SAVE_H

#include <QtCore>

class Save
{
public:
	Save();
	static void save(QPixmap pixmap);
	
private:
	// 西暦年 4桁文字列
	static QString year4(){
		return QString("%1").
				arg(QDateTime::currentDateTime().date().year(),
					4,10,QChar('0'));
	}
	
	// 西暦年 2桁文字列
	static QString year2(){
		return intToStr2(QDateTime::currentDateTime().date().year());
	}
	
	// 月 2桁文字列
	static QString month(){
		return intToStr2(QDateTime::currentDateTime().date().month());
	}
	
	// 日 2桁文字列
	static QString day(){
		return intToStr2(QDateTime::currentDateTime().date().day());
	}
	
	// 時間 2桁文字列
	static QString hour(){
		return intToStr2(QDateTime::currentDateTime().time().hour());
	}
	
	// 分 2桁文字列
	static QString min(){
		return intToStr2(QDateTime::currentDateTime().time().minute());
	}
	
	// 秒 2桁文字列
	static QString sec(){
		return intToStr2(QDateTime::currentDateTime().time().second());
	}
	
	// 2桁文字列
	static QString intToStr2(int num){
		return QString("%1").arg(num,2,10,QChar('0'));
	}
};

#endif // SAVE_H

static関数であるsave()にpixmapを渡すと、ファイル名をつけて保存してくれる感じです。
日付や時間をファイル名につけるための関数はインライン関数で書いちゃいます。

現在の日時はQDateTimeのstatic関数、currentDateTime()で取得できます。
そこから日付はdate()、時間はtime()で取り出すという感じです。
QDateTime Class Reference | Documentation | Qt Project

Save.cpp
#include "save.h"

#include <qpixmap.h>
#include "settings.h"

Save::Save()
{
}

void Save::save(QPixmap pixmap)
{
	QString filepath;
	filepath = Settings::getInstance().path();
	filepath += "/";
	filepath += Settings::getInstance().filename();
	filepath += ".png";
	
	// 現在時刻が必要であれば変換
	filepath.replace("YYYY",year4());
	filepath.replace("YY",year2());
	filepath.replace("MM",month());
	filepath.replace("DD",day());
	filepath.replace("HH",hour());
	filepath.replace("mm",min());
	filepath.replace("SS",sec());
	// todo 連番に対応

	qDebug() << filepath;
	pixmap.save(filepath);
}

なんかもっとうまいやり方があったような気がしなくもない気がしてきました。
QDateTimeにこういうのあったのでは…?調べます。

QDateTime Class Reference | Documentation | Qt Project

QDateTimeクラスのtoString()を使えば、フォーマットに応じた文字列を返してくれるみたいですね。
やっぱりあったー!やだー!改善します!

Save.h(改善後)
#ifndef SAVE_H
#define SAVE_H

#include <QtCore>

class Save
{
public:
	Save();
	static void save(QPixmap pixmap);
};

#endif // SAVE_H
Save.cpp(改善後)
#include "save.h"

#include <qpixmap.h>
#include "settings.h"

Save::Save()
{
}

void Save::save(QPixmap pixmap)
{
	QString filepath = Settings::getInstance().path();
	QString filename = QDateTime::currentDateTime().toString(
				Settings::getInstance().filename());
	
	filepath += "/";
	filepath += filename;
	filepath += ".png";
	
	pixmap.save(filepath);
}

うーん なんともシンプルに改善できました。
事前にもっとちゃんと調べたらよかったです。