Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@mususu644

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

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()で、ファイルの最終更新日時を取得
など、大変 便利に使える。

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

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?