メモの保存とロード
ここでは前回未実装のopenとsaveのスロットを実装します。
このソースコードはQtのインストールディレクトリ以下の次の場所にあります。
Examples/Qt-5.5/widgets/tutorials/gettingStarted/gsQt/part5
アプリケーションを実行して、FileメニューのLoadを選択すると次のダイアログが表示されます。
openスロットの実装
void Notepad::open()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
tr("Text Files (*.txt);;C++ Files (*.cpp *.h)"));
if (!fileName.isEmpty()) {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
return;
}
QTextStream in(&file);
textEdit->setText(in.readAll());
file.close();
}
}
まずはQFileDialogを使って、ユーザーにどのファイルを開くか問い合わせる必要があります。
静的メンバ関数のgetOpenFileName()を呼び出すことでファイル選択のモーダルダイアログを表示します。
getOpenFileName()は、ユーザーがファイルを選択した場合、そのファイルパスを返します。キャンセルボタンが押された場合は、空文字を返します。
ファイルパスが返ってきた場合、QFileのopen()を使ってファイルを開きます。
QFileのopen()はファイルが正常に開けた場合はtrueを返します。
ファイルが開けなかった場合はQMessageBoxを使って、エラーメッセージを表示します。
ファイルの中身の読み込みはQFileをラップしたQTextStreamを使って簡単にできます。
readAll()はファイルの中身をQStringオブジェクトにして返します。
そして、そのQStringオブジェクトをテキストエディタに設定します。
ファイルの中身を読み込んだ後はファイルの情報は必要ありませんので、QFileのclose()でファイルデスクリプタをOSに戻します。
saveスロットの実装
void Notepad::save()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "",
tr("Text Files (*.txt);;C++ Files (*.cpp *.h)"));
if (!fileName.isEmpty()) {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
// error message
} else {
QTextStream stream(&file);
stream << textEdit->toPlainText();
stream.flush();
file.close();
}
}
}
saveスロットではテキストエディタで編集したテキストをファイルに保存します。
openスロットの実装とほぼ逆で、まずはQFileDialogでファイルの保存先をユーザーに問い合わせます。
その後、QTextStreamの<<オペレーターでQStringをファイルに保存します。