📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の19版が非表示)
5行目: 5行目:
ファイルフォーマットは、公開・非公開のものがあり、各フォーマットを理解してファイルの入出力を行うことは難しいが、<br>
ファイルフォーマットは、公開・非公開のものがあり、各フォーマットを理解してファイルの入出力を行うことは難しいが、<br>
ライブラリを使用する場合、簡単に入出力を行うことができる。<br>
ライブラリを使用する場合、簡単に入出力を行うことができる。<br>
<br><br>
== 実行ファイルがあるディレクトリ ==
実行ファイルが存在するディレクトリを取得するには、以下のように記述する。<br>
<syntaxhighlight lang="c++">
QString strAppDir = QCoreApplication::applicationDirPath();
</syntaxhighlight>
<br><br>
== QIODevice::Textオプション ==
<code>QIODevice::Text</code>を指定する場合、改行コードは自動的にプラットフォームに合わせて変換される。<br>
<br><br>
<br><br>


67行目: 78行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== 文字列の検索 ====
特定の文字列を検索する場合は、テキストファイルを読み込みながら検索する文字列が各行に含まれているかを確認する。<br>
<br>
以下の例では、各行が"hoge"という文字列と一致するかどうかを確認している。<br>
一致する行が存在する場合、その行を出力して処理を終了して、一致する行が存在しない場合はその旨を出力する。<br>
<syntaxhighlight lang="c++">
bool SearchString(const QString &filePath, const QString &str)
{
    QFile File(filePath);
    if (!File.open(QIODevice::ReadOnly | QIODevice::Text)) {
      std::cerr << QString("ファイルのオープンに失敗 : %1").arg(File.errorString()).toStdString() << std::endl;
      return false;
    }
    QTextStream in(&File);
    while (!in.atEnd()) {
      QString line = in.readLine();
      if (line == str) {
          std::cout << QString("%1 が見つかりました").arg(str).toStdString() << std::endl;
          File.close();
          return true;
      }
    }
    std::cout << QString("%1 は見つかりませんでした").arg(str).toStdString() << std::endl;
    File.close();
    return false;
}
</syntaxhighlight>
<br>
==== バイナリデータの読み込み ====
==== バイナリデータの読み込み ====
バイナリデータを読み込む場合は、<code>QFile</code>クラスの<code>readLine</code>メソッドまたは<code>readAll</code>メソッドを使用する。<br>
バイナリデータを読み込む場合は、<code>QFile</code>クラスの<code>readLine</code>メソッドまたは<code>readAll</code>メソッドを使用する。<br>
115行目: 158行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
以下の例では、QTextStreamクラスを使用して書式を設定している。<br>
<syntaxhighlight lang="c++">
// 浮動小数
QFile file(strFName);
QTextStream OutStream(&file);
// 浮動小数 e+形式
OutStream.setRealNumberNotation(QTextStream::ScientificNotation);
// 浮動小数の桁数を固定
OutStream.setRealNumberNotation(QTextStream::FixedNotation);
// 浮動小数点の桁数を設定
OutStream.setRealNumberPrecision(3);
</syntaxhighlight>
<br>
列ごとに列幅を設定する場合は、1つ列を出力するごとに設定する必要がある。<br>
<syntaxhighlight lang="c++">
QFile file(strFName);
QTextStream OutStream(&file);
// 列を右寄せに設定
OutStream.setFieldAlignment(QTextStream::AlignRight);
// 1列目の文字数を設定 
OutStream.setFieldWidth(20);
OutStream << "1列目"
// 2列目の文字数を設定 
// 最終列の改行では、std::endlを使用してはならない
OutStream.setFieldWidth(40);
OutStream << "2列目" + "\n" << flush;
</syntaxhighlight>
<br>
<u>※注意</u><br>
<u>最終列の改行において、std::endlを使用する場合、それが1つの列として扱われるため、</u><br>
<u>空列が1つ余計に追加されて余分な空白が末尾に追加されてしまう。</u><br>
<br>
以下の例では、出力エンコーディングを指定する。<br>
<syntaxhighlight lang="c++">
// 例. UTF-8にする場合
QFile file(strFName);
QTextStream OutStream(&file);
OutStream.setCodec("UTF-8");
</syntaxhighlight>
<br>
出力エンコードをShift-JISに設定する場合、"~"が文字化けする時がある。<br>
詳細を知りたい場合は、こちらのWebサイトを参照すること。<br>
http://park3.wakwak.com/~ozashin/sw_tips/webapp_tips/sjis_charset.html<br>
<br>
この文字化けを直すには、以下のように記述する。(Winodwsのみ)<br>
<syntaxhighlight lang="c++">
QFile file(strFName);
QTextStream OutStream(&file);
OutStream << str.replace(QChar(0x301C), QChar(0xFF5E));
</syntaxhighlight>
<br>
以下の例では、ファイルの先頭にテキストを追記している。<br>
# まず、既存のファイルの内容を読み込み、その内容をメモリ(<code>QString</code>クラスや<code>QByteArray</code>)に保存する。
# 次に、追加する内容と元のファイル内容を結合させる。
# 最後に、新しい内容でファイルを上書きする。
<syntaxhighlight lang="c++">
#include <QFile>
#include <QTextStream>
QFile File("/tmp/sample.txt");
if (!File.open(QIODevice::ReadOnly | QIODevice::Text)) {
    std::cerr << QString("Failed to open file for reading.").toStdString() << std::endl;
    return -1;
}
// 元のファイル内容を読み込む
QString oldText;
QTextStream in(&File);
oldText = in.readAll();
File.close();
// 追加する内容と元のファイル内容を結合させる
QString newText = "hoge" + "\n" + oldText;
// ファイルに新しい内容を書き込む
if (!File.open(QIODevice::WriteOnly | QIODevice::Text)) {
    std::cerr << QString("Failed to open file for writing.").toStdString() << std::endl;
    return -1;
}
QTextStream out(&File);
out << newText;
File.close();
</syntaxhighlight>
<br>
==== バイナリデータの書き込み ====
==== バイナリデータの書き込み ====
バイナリデータを書き込む場合は、<code>QFile</code>クラスの<code>write</code>メソッドを使用する。<br>
バイナリデータを書き込む場合は、<code>QFile</code>クラスの<code>write</code>メソッドを使用する。<br>
138行目: 275行目:
  File.close();
  File.close();
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== CSVファイル ==
以下の例では、CSVファイルを作成している。<br>
処理手順は以下の通りである。<br>
# 数値データを生成する。<br>ここでは、sin曲線y=sin(x)を生成する。
# 数値データをテキストデータに変換する。
# ファイル保存ダイアログを開いて、保存するファイル名を入力する。
# 全テキストデータを書き込む。
<br>
<br>
また、<code>QByteArray</code>クラスは、以下のように宣言することができる。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <QFileDialog>
  // 宣言 1
  #include <QMessageBox>
  QByteArray data_1 = {0x0c, 0x06, 0x04, 0x04, 0x02, 0x00};
#include <QTextStream>
#include <QFile>
#include <vector>
#include <math.h>
#include <sstream>
#include "mainwindow.h"
#include "ui_mainwindow.h"
using namespace std;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
   
   
  void MainWindow::OnButtonClicked()
  // 宣言 2
{
QByteArray data_2 = QByteArray("\x0c\x06\x04\x04\x02\x00", 6);
    // Input File Name
    QString FileName = QFileDialog::getSaveFileName(this, tr("Save CSV File"), "", tr("CSV (*.csv);;All Files (*)"));
   
   
    if(FileName.isEmpty())
// 宣言 3
    { // Cancel
QByteArray data_3;
      return;
data_3.append((char)0x0c);
    }
data_3.append((char)0x06);
data_3.append((char)0x04);
data_3.append((char)0x04);
  data_3.append((char)0x02);
data_3.append((char)0x00);
data_3.append((char)0xFF);
   
   
    // Generate CSV Data
std::cout << data_3.size() << std::endl;
    int iSize = 100;
std::cout << data_3.toHex().toStdString().c_str() << std::endl;
    vector<double> lx(iSize, 0.0f),
                  ly(iSize, 0.0f);
   
   
    double dx = 2 * 3.15159 / iSize;
// 宣言 4
    for(int i = 0; i < iSize; i++)
char v1 = 0x01,
    {
      v2 = 0x02;
      lx[i] = i * dx;
  QByteArray data_4(std::begin<char>({0x00, v1, v2, v2, 0x05, 0x06, '\xf3'}), 7);
      ly[i] = sin(vx);
    }
   
    // Convert from Double to String
    QString strFileData = "";
    //stringstream ss;
    for(int i = 0; i < iSize; i++)
    {
        strFileData += lx[i] + ", " + ly[i] + "\n";
        //ss << lx[i] << "," << ly[i] << endl;
    }
   
    // Write to File
    QFile File(FileName);
 
    if(!File.open(QIODevice::WriteOnly))
    {
        QMessageBox::information(this, tr("Unable to open file"), File.errorString());
        return;
    }
    QTextStream OutStream(&File);
    // 浮動小数点をe形式にする
    //OutStream.setRealNumberNotation(QTextStream::ScientificNotation);
    // 浮動小数点の桁数を固定
    //OutStream.setRealNumberNotation(QTextStream::FixedNotation);
    // 浮動小数点の桁数を設定
    OutStream.setRealNumberPrecision(3);
    OutStream << strFileData;
    //OutStream << ss.str().c_str();
    File.close();
}
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>


== INIファイル ==
== ファイル情報 ==
以下の例では、ソフトウェアにおけるウインドウの状態を保存している。<br>
==== ファイルの存在確認 ====
<br>
ファイルが存在すれば<code>true</code>、存在しなければ<code>false</code>を返す。<br>
ウインドウの座標、縦横のサイズ、状態、最少幅、タイトル文字列をSetting.iniファイルに保存する。<br>
もし、Settings.iniファイルが存在する場合は上書きする。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  void MainWindow::saveSetting()
  #include <QFileInfo>
bool MainWindow::FileExists(const QString &FileName)
  {
  {
     QSettings settings("settings.ini", QSettings::IniFormat, this);
     QFileInfo FileInfo(FileName);
    settings.beginGroup("MainWindow");
    settings.setValue("pos", pos());
   
   
     if(!isMaximized())
     return FileInfo.exists();
    {
      settings.setValue("size", size());
    }
    settings.setValue("maximized", isMaximized());
    settings.setValue("miniwid", minimumWidth());
    settings.setValue("title", windowTitle());
    settings.endGroup();
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
以下の例では、前回のウインドウの状態を復元している。<br>
また、<code>QFile</code>クラスを使用する場合は、以下のように記述する。<br>
Setting.iniファイルから必要な情報を読み込み、画面の状態を変更する。<br>
<br>
Settings.iniファイルが存在しない場合またはpos等のキー値が無ければ何もしない。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  bool MainWindow::loadSetting()
  if(QFile::exists("<ファイルのパス>"))
  {
  { // ファイルが存在する場合
    QSettings settings("settings.ini", QSettings::IniFormat, this);
    settings.beginGroup("MainWindow");
   
   
    if(settings.contains("pos"))
  }
    {
  else
      move(settings.value("pos", QPoint(50, 40)).toPoint());
  {  // ファイルが存在しない場合
    }
   
    if(settings.contains("size"))
    {
      resize(settings.value("size", QSize(800, 720)).toSize());
    }
   
    if(settings.value("maximized").toBool())
    {
      setWindowState(windowState() | Qt::WindowMaximized);
    }
   
    if(settings.contains("miniwid"))
    {
      setMinimumWidth(settings.value("miniwid", 400).toInt());
    }
   
    if(settings.contains("title"))
    {
      setWindowTitle(settings.value("title", "なし").toString());
    }
   
   
    settings.endGroup();
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
以下に、設定ファイル(Settings.ini)の内容を示す。<br>
左上位置(46, 15)、画面サイズ(800x600)、最大化(false)、最少幅(400)、画面のタイトルが"サンプル画面"の場合である。<br>
[MainWindow]
pos=@Point(46 15)
size=@Size(800 600)
maximized=false
miniwid=400
title=\x30b5\x30f3\x30d7\x30eb\x753b\x9762
<br><br>


== ファイル情報 ==
==== ファイルタイプの取得 ====
ファイルが存在すればtrue、存在しなければfalseを返す。<br>
<syntaxhighlight lang="c++">
bool MainWindow::FileExists(QString FileName)
{
    QFileInfo FileInfo(FileName);
    return FileInfo.exists();
}
</syntaxhighlight>
<br>
ファイルタイプの確認において、ファイルは1、ディレクトリは2、その他は0を返す。<br>
ファイルタイプの確認において、ファイルは1、ディレクトリは2、その他は0を返す。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
333行目: 350行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== ファイル情報の取得 ====
以下に、ファイル情報の取得例を示す。<br>
以下に、ファイル情報の取得例を示す。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  QFileInfo f1("~/memo.txt");
  QFileInfo f1("/home/<ユーザ名>/memo.txt");
  QFileInfo f2("~/arc.tar.gz");
  QFileInfo f2("/home/<ユーザ名>/tmp/arc.tar.gz");
  QFileInfo f3("~/memo.txt_シンボリックリンク");
  QFileInfo f3("/home/<ユーザ名>/memo.txt_シンボリックリンク");
</syntaxhighlight>
<br>
Windowsのリンクファイルも、リンク先のファイルサイズを返す。<br>
<center>
{| class="wikitable"
|+ ファイル情報の取得例
|-
! 取得する情報 !! 使用例 !! 出力
|-
| ファイルのフルパス || f1.absoluteFilePath()<br>f2.absoluteFilePath() || "/home/<ユーザ名>/memo.txt"<br>"/home/<ユーザ名>/tmp/arc.tar.gz"
|-
| ファイルが存在するディレクトリのフルパス || f1.absolutePath()<br>f2.absolutePath() || "/home/<ユーザ名>"<br>"/home/<ユーザ名>/tmp"
|-
| ファイル名のみ || f1.fileName()<br>f2.fileName() || "memo.txt"<br>"arc.tar.gz"
|-
| ベース名 || f1.baseName()<br>f2.baseName() || "memo"<br>"arc"
|-
| 完全なベース名 || f1.completeBaseName()<br>f2.completeBaseName() || "memo"<br>"arc.tar"
|-
| 拡張子 || f1.suffix()<br>f2.suffix() || "txt"<br>"gz"
|-
| 完全な拡張子 || f1.completeSuffix()<br>f2.completeSuffix() || "txt"<br>"tar.gz"
|-
| リンクの絶対パス || f3.symLinkTarget() || "/home/<ユーザ名>/memo.txt"
|-
| 作成日 || f1.created() || QDateTime
|-
| 更新日 || f1.lastModified() || QDateTime
|-
| アクセス日 || f1.lastRead() || QDateTime
|-
| サイズ || f1.size()<br>f3.size() || 5590<br>5590
|}
</center>
<br>
==== ファイル情報の確認 ====
以下に、ファイル情報の確認方法を示す。<br>
<syntaxhighlight lang="c++">
QFileInfo FileInfo("チェックするパス");
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<center>
{| class="wikitable"
|+ ファイル情報の確認例
|-
! 用途 !! 使用例 !! 出力
|-
| 絶対パスか || FileInfo.isAbsolute() || true: 絶対パス<br>false: 他
|-
| 相対パス || FileInfo.isRelative() || true: 相対パス<br>false: 他
|-
| ルートディレクトリに存在するか || FileInfo.isRoot() || true: ある<br>false: ない
|-
| ファイルか || FileInfo.isFile() || true: ファイル<br>false: 他
|-
| ディレクトリか || FileInfo.isDir() || true: ディレクトリ<br>false: 他
|-
| 隠しファイルか || FileInfo.isHidden() || true: 隠しファイル<br>false: 他
|-
| リンクファイルか || FileInfo.isSymLink() || true: リンクファイル<br>false: 他
|-
| 読み込み可能か || FileInfo.isReadable() || true: 可能<br>false: 不可
|-
| 書き込み可能か || FileInfo.isWritable() || true: 可能<br>false: 不可
|-
| 実行可能か || FileInfo.isExecutable() || true: 可能<br>false: 不可
|}
</center>
<br><br>


== ファイルの検索 ==
==== QDirを使用する ====
<syntaxhighlight lang="c++">
QString path = QApplication::applicationDirPath() + "/images/";
QStringList nameFilters;
nameFilters.append("*.png");
nameFilters.append("*.jpg");
QDir dir(path);
QStringList entry = dir.entryList(nameFilters, QDir::Files);
for(QString file : entry)
{  // 検索して見つかったファイル群
    qDebug() << dir.filePath(file);
}
</syntaxhighlight>
<br>
==== QDirIteratorを使用する ====
<syntaxhighlight lang="c++">
QString path = QApplication::applicationDirPath() + "/images/";
QStringList nameFilters;
nameFilters.append("*.png");
nameFilters.append("*.jpg");
QDirIterator itDirs(path, nameFilters, QDir::Files);
while(itDirs.hasNext())
{
    QString file = itDirs.next();
    qDebug() << file;
}
</syntaxhighlight>
<br><br>
<br><br>


352行目: 470行目:
   
   
   foreach(QString File, dir.entryList(QDir::Files))
   foreach(QString File, dir.entryList(QDir::Files))
   {
   { // ディレクトリ直下に存在するファイルの探索(深さ1のファイル探索)
       list.append(Path + QDir::separator() + File);
       list.append(Path + QDir::separator() + File);
   }
   }
   
   
   foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
   foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
   {
   { // サブディレクトリに存在するファイルの探索
       list = list << SearchFiles(Path + QDir::separator() + subDir);
       list = list << SearchFiles(Path + QDir::separator() + subDir);
   }
   }
363行目: 481行目:
   return list;
   return list;
  }
  }
</syntaxhighlight>
<br>
<u>再帰呼び出しを使用せずに、サブディレクトリまで検索することもできる。</u><br>
<syntaxhighlight lang="c++">
QString path = QApplication::applicationDirPath() + "/images/";
QStringList nameFilters;
nameFilters.append("*.png");
nameFilters.append("*.jpg");
QDirIterator itDirs(path, nameFilters, QDir::Files, QDirIterator::Subdirectories);
while(itDirs.hasNext())
{
    QString file = itDirs.next();
    qDebug() << file;
}
</syntaxhighlight>
<br><br>
== 一時ファイル ==
一時ファイルを作成するには、<code>QTemporaryFile</code>クラスを使用する。<br>
<br>
<code>QFile</code>クラスと異なる点は、以下の通りである。<br>
* 常に読み書きモードで開く。
* ファイルパスが衝突しない。
* デストラクタが呼び出されたら自動的に削除される。
<br>
特に、ファイル名には重複した名前が付かない仕組みになっている。(ファイルパスが衝突しないことは重要である)<br>
ファイル名を重複しないように、"<ソフトウェア名>.<xxx>"のような名前を付けて、システムディレクトリに保存される。<br>
<br>
以下の例では、既存のファイルをシステムディレクトリの一時ファイルとしてコピーしている。<br>
<br>
一時ファイルのパスは、<code>fileTemplate</code>メソッドから取得できる。<br>
(<code>setFileTemplate</code>メソッドを使用して、一時ファイルのパスを変更することもできる)<br>
他は、<code>QFile</code>クラスの使用方法と同様である。<br>
<syntaxhighlight lang="c++">
QTemporaryFile TmpFile;
 
QFile::copy("<既存ファイルのパス>", TmpFile.fileTemplate());
TmpFile.open();
// ...略
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
== メモリマップファイル ==
メモリマップファイルとは、メモリ空間の一部のように直接読み書きできるファイルのことである。<br>
<br>
メモリマップファイルのメリットを以下に示す。<br>
* 高速にアクセスすることが可能である。
* メモリ内容を書き換えることにより、ファイルの内容を更新できる。
* 大きなサイズのファイルを扱う場合、使用するメモリ量が少ない。
<br>
メモリマッピングには、<code>QFileDevice</code>クラスの<code>map</code>メソッドを使用する。<br>
# <code>QFile</code>クラスを使用して、ファイルを作成または開く。
# <code>map</code>メソッドを使用して、ファイルの内容をメモリにマッピングする。<br>マッピングに成功した場合、ファイルのメモリ空間を<code>unsigned char</code>型の配列として返す。<br>それを介して、ファイルを読み書きすることが可能となる。
# マッピングした内容を読み書きする。
# メモリをアンマッピングする。
<br>
<code>QFile</code>クラスのデストラクタが呼ばれた場合、または、同じインスタンスで新しいファイルを開いた場合は、自動的にアンマッピングされる。<br>
<br>
以下の例では、既存のファイルを開いて10文字目の文字を書き換えている。<br>
<syntaxhighlight lang="c++">
// ファイルを開く
QFile file("Sample.txt");
file.open(QFile::ReadWrite);
// ファイルの内容をメモリにマッピング
unsigned char *pMem = file.map(0, file.size());
// 10文字目を書き換える
pMem[10] = 'A';
// メモリをアンマッピング
file.unmap(memory);
// ファイルを閉じる
file.close();
</syntaxhighlight>
<br><br>
== ファイルパス ==
==== 絶対パスの検証 ====
ファイルのパスがファイルシステム上で有効な形式を持っているかどうか (例: 不正な文字、パスの構造がシステムの要件を満たしているか等) を検証する。<br>
<br>
Qtでは、有効なパスが有効かどうかを検証するメソッドは存在しない。<br>
しかし、<code>QFileInfo</code>クラスおよび<code>QDir</code>クラスを使用して間接的にパスの妥当性を検証することができる。<br>
<syntaxhighlight lang="c++">
#include <QFileInfo>
#include <QDir>
// QFileInfoを使ってパスの情報を取得
QFileInfo FileInfo("/tmp/sample.txt");
// ファイル名に使用できない文字が含まれているかどうかを確認
QString fileName = FileInfo.fileName();
if (fileName.isEmpty() || fileName.contains(QRegExp("[\/\\0]"))) {
    // ファイル名に不適切な文字が含まれている場合
    return false;
}
// パスが絶対パスかどうかを確認 (相対パスは不適切とする)
if (!FileInfo.isAbsolute()) {
    return false;
}
</syntaxhighlight>
<br>
==== 相対パスの確認 ====
相対パスの場合、基準となるディレクトリからの解決が可能かどうかを確認する。<br>
相対パスは特定のディレクトリを基準として解釈されるため、その基準ディレクトリから相対パスを解決 (絶対パスに変換) することにより、パスが想定通りの形式であるかを検証できる。<br>
<br>
以下の例では、指定された基準ディレクトリ(basePath)から相対パス(relativePath)を解決して絶対パスに変換して、その絶対パスに対してファイル名が適切な形式を持つかどうか等の検証を行っている。<br>
実際のシナリオでは、更に詳細な検証が必要になるが、このように相対パスを絶対パスに変換して検証することになる。<br>
<syntaxhighlight lang="c++">
#include <QDir>
QString basePath    = "<基準ディレクトリ>";
QString relativePath = "<相対パス>";
QDir baseDir(basePath);
QString resolvedPath = baseDir.absoluteFilePath(relativePath);
// 解決されたパスを確認 (不正な文字等)
QFileInfo FileInfo(resolvedPath);
QString fileName = FileInfo.fileName();
if (fileName.isEmpty() || fileName.contains(QRegExp("[\/\\0]"))) {
    // ファイル名に不適切な文字が含まれている場合
    return false;
}
</syntaxhighlight>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]