Turn On Blog

ぺーぺーSEの色々メモ

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

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

今回やること

  • 設定クラスの作成
  • 設定ダイアログクラスの作成

設定クラスはシングルトンとして作成します。
コンストラクタで設定ファイルから値を読み取り、
デストラクタで設定ファイルに値を書き込みます。
http://www.websequencediagrams.com/cgi-bin/cdraw?lz=UGFyZW50LT5TZXR0aW5ncyA6IOeUn-aIkAoACggtPnMAFQcuaW5pIDog44KI44G_44GT44G_&s=napkin
http://www.websequencediagrams.com/cgi-bin/cdraw?lz=UGFyZW50LT5TZXR0aW5ncyA6IOegtOajhAoACggtPnMAFQcuaW5pIDog44GL44GN44GT44G_&s=napkin

ユーザが設定ダイアログクラスで変更を確定すると、設定クラスに情報が渡されます。
http://www.websequencediagrams.com/cgi-bin/cdraw?lz=dXNlci0-U2V0dGluZ0RpYWxvZyA6IGZpbmlzaOaKvOS4iwoAEA0AIwlzOiBzZXRQYXRoAAQdRmlsZU5hbWU&s=napkin

設定クラスの作成

Settings.h
#ifndef SETTINGS_H
#define SETTINGS_H

#include <QtCore>

class Settings
{
private:
	QString path_;
	QString filename_;
	
public:
	// singleton
	static Settings &getInstance(void);
	
	// getter/setter
	void setPath(const QString &path) { path_ = path; }
	void setFilename(const QString &filename) { filename_ = filename; }
	QString path(void){ return path_; }
	QString filename(void){ return filename_; }
	
private:
	// singleton
	Settings();
	Settings(const Settings &){}
	Settings &operator=(const Settings &){}
	
	~Settings();
	
};

#endif // SETTINGS_H

シングルトンなので、コンストラクタはprivateにして抑制します。
コピーコンストラクタは使わないのでインライン関数で処理なし。
通常のコンストラクタ、デストラクタではファイルへの読み書きを行うので、.cppで定義します。

Settings.cpp
#include "settings.h"

Settings &Settings::getInstance()
{
	static Settings settings;
	return settings;
}

Settings::Settings(){
	// setting.iniをini形式で開く
	QSettings settings("setting.ini", QSettings::IniFormat);
	settings.setIniCodec("UTF-8");

	// データを読み出し
	filename_ = settings.value("settings/filename").toString();
	path_ = settings.value("settings/path").toString();
}

Settings::~Settings(){
	// setting.iniをini形式で開く
	QSettings settings("setting.ini", QSettings::IniFormat);
	settings.setIniCodec("UTF-8");
	
	// データを書出し
	settings.setValue("settings/filename", filename_);
	settings.setValue("settings/path", path_);
}

冒頭のシーケンスのとおり、コンストラクタで読み出し、デストラクタで書き出しを行います。

設定ダイアログクラスの作成

フォーム(.ui)ファイルつきのクラス、SettingDialogを作成します。

SettingDialog.ui

フォームは以下のように作成しました。
f:id:taurano:20141227231431p:plain
folderは撮ったスクリーンショットの保存先、
nameはスクリーンショットの命名ルールを指定します。

SettingDialog.h
#ifndef SETTINGDIALOG_H
#define SETTINGDIALOG_H

#include <QDialog>

namespace Ui {
class SettingDialog;
}

class SettingDialog : public QDialog
{
	Q_OBJECT
	
public:
	explicit SettingDialog(QWidget *parent = 0);
	~SettingDialog();
	void initialize();
	
public slots:
	void selectFolder(void);
	void showDialog();
	
private slots:
	void finish(void);
	
private:
	Ui::SettingDialog *ui;
	void loadSettings();
};

#endif // SETTINGDIALOG_H
SettingDialog.cpp
#include "settingdialog.h"
#include "ui_settingdialog.h"

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

SettingDialog::SettingDialog(QWidget *parent) :
	QDialog(parent),
	ui(new Ui::SettingDialog)
{
	ui->setupUi(this);
}

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

void SettingDialog::initialize()
{
	// 確定ボタンで設定を確定する
	connect(ui->b_finish, SIGNAL(clicked()),
			this, SLOT(finish()));
	
	// キャンセルボタンで設定を破棄して画面を閉じる
	connect(ui->b_cancel, SIGNAL(clicked()),
			this, SLOT(close()));
	
	// フォルダ選択ボタンがクリックされたらselectFolderを呼び出す
	connect(ui->b_folder, SIGNAL(clicked()),
			this, SLOT(selectFolder()));
	
	// settingsクラスから設定を読み込む
	loadSettings();
}

void SettingDialog::showDialog()
{
	// 設定を読み込んでから表示する
	loadSettings();
	show();
}

void SettingDialog::selectFolder()
{
	// QFileDialogによってユーザにフォルダを選択させる
	QString folder = QFileDialog::getExistingDirectory(this,"screenshot save folder");
	
	// pathラベルのテキストに、ユーザが選択したフォルダへのパスを設定する
	ui->l_path->setText(folder);
}

void SettingDialog::finish()
{
	// Settingsクラスに設定を反映する
	Settings::getInstance().setFilename(ui->le_filename->text());
	Settings::getInstance().setPath(ui->l_path->text());
	this->close();
}

void SettingDialog::loadSettings()
{
	// Settingsクラスから設定を読み込み、初期状態とする
	ui->l_path->setText(Settings::getInstance().path());
	ui->le_filename->setText(Settings::getInstance().filename());
	
}

QLabel・QLineEditのtextプロパティをデータ保持に使っています。
画面を開くときにはQSettingsクラスから現在のデータを取り出し、画面表示時の初期状態とします。
逆に画面を閉じるときには、finishが押されたときのみQSettingへのデータ保存を行います。

できたー

無事データの保持・編集部分ができました~~
あと残ってるストーリーは4つです がんばろう