LoginSignup
1
0

More than 1 year has passed since last update.

はじめてC++で画面を作ろう! (6) QFileInfo編

Last updated at Posted at 2021-06-05

18.「ファイル情報をチェックする」を作ろう!!

「ファイルを開く」と「名前を付けて保存」のファイル名がバラバラなのは、ファイル名を関数間で、共有できていないからだ!

各関数から使える「共有変数」を定義する。

Qtには、QFileInfoクラスが用意されており、これを使ってファイル名などを共有する。

この変数は、mainwindow.hファイルのmainwindowクラスに変数を定義する。
[1] QFileInfoをインクルードする。
[2] 共有変数: fileInfoを定義する。

mainwindow.h
...省略...
#include <QMainWindow>
#include <QFileInfo> /* これを追加 */

...省略...

class MainWindow : public QMainWindow
{
...省略...

private:
    Ui::MainWindow *ui;
    QFileInfo fileInfo; /* これを追加 */
};
#endif // MAINWINDOW_H

[3] 共有変数にファイル名を設定する。 fileInfo.setFile()
[4] fileInfoから、絶対パスを取得する。fileInfo.absoluteFilePath()
[5] getSaveFileName()3番目の引数に絶対パスを指定する。

mainwindow.cpp
...省略...

MainWindow::MainWindow(QWidget *parent)
...省略...

void MainWindow::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open"), "", tr("Text File(*.txt);;All Files(*.*)"));
    fileInfo.setFile(fileName); /* これを追加 */
    ui->statusbar->showMessage(fileInfo.absoluteFilePath()); /* fileName変数から、fileInfoに変更する */
}

void MainWindow::on_actionSaveAs_triggered()
{
    QString filePath = fileInfo.absoluteFilePath(); /* これを追加 */

    QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), filePath, tr("Text File(*.txt)")); /* 3番目の引数を""から取得したパスを設定 */
    fileInfo.setFile(fileName); /* これを追加 */
    ui->statusbar->showMessage(fileInfo.absoluteFilePath()); /* fileName変数から、fileInfoに変更する */
}

19.動作確認!!

画面の左下にある、右三角マークの「実行」ボタンをクリックすると、何やら右下側にビルドしている状況が表示され、「MainWindow」が出てくる!

作ったアプリのメニューで、[File | Open]で、開き(つもり 実際には、まだ何もしていない)、[File | SaveAs]で、開いた場所(=パス)で、開いたファイル名が出てくるはずだ!!

※SaveAsで、上書きOKでも、まだ何もしていないので、影響はありません。

ただ、SaveAsで、[キャンセル]した場合、ファイル名なしの状態で、fileInfoに設定されるので、続けて[File | SaveAs]を行うと、ファイル名が消えてしまう。

20.C++のif文が登場!!

QString型には、文字列の長さが取得できるので、「もし。長さが 0以上ならば、fileInfoに設定する」ように追加していく。

mainwindow.cpp
void MainWindow::on_actionSaveAs_triggered()
{
    QString filePath = fileInfo.absoluteFilePath();
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), filePath, tr("Text File(*.txt)"));

    if (fileName.length() > 0){ /* これを追加 */
        fileInfo.setFile(fileName);
    }
    ui->statusbar->showMessage(fileInfo.absoluteFilePath());
}

21.再度、動作確認!!

画面の左下にある、右三角マークの「実行」ボタンをクリックして、「MainWindow」が出てくる!

[1] [File | Open]で、他のフォルダーのファイルを開いてみる。
[2] [File | SaveAs]で、[キャンセル]してみる。
[3] 再度、[File | SaveAs]で、開いたファイル名がでる事を確認する。

22.QFileInfoクラスは、便利!!

QFileInfoクラスは、絶対パス(absoluteFilePath)以外にも、いろいろ使える。

[1] fileInfo.baseName()で、ファイル名(拡張子なし)を取得
[2] fileInfo.fileName()で、ファイル名(拡張子あり)を取得
[3] fileInfo.suffix()で、拡張子のみを取得
[4] fileInfo.size()で、ファイル サイズを取得
[5] fileInfo.lastModified()で、ファイルの最終更新日時を取得
など、大変 便利に使える。

今回は、ここまで次回は、アプリ情報を記録しよう!!です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0