Qt

QString

QStringクラス

QString Class | Qt Core 5.15.15

文字列の最後の文字を取得

QString str = "abcdefg";
str.back();    // return g; (QChar)

空の文字列に対して実行すると未定義の動作となるため注意。

文字列の後ろからn文字の文字列を取得

QString x = "abcdefg";
QString y = x.right(3);  // y == "efg"

文字列の分割

QString str = "abc/def/ghi";
QStringList list = str.split("/");    // list: ["abc", "def", "ghi"]
QString str2 = str.split("/")[1];     // str2: "def"

QFile

環境

Raspberry Pi 3B+

$ uname -a    // Linux 5.10.103-v7+
$ cat /etc/os-release        // Raspbian GNU/Linux 10 (buster)
$ cat /etc/debian_version    // 10.13

Qt Creator 4.8.2
Qt 5.11.3 (GCC 8.3.0, 32bit)

QFileクラス

テキストファイル、バイナリーファイル、リソースの読み取り・書き込み用クラス。

QFileのみで読み取り・書き取り動作を実装できる。
QTextStream, QDataStreamを併せることでより便利な活用ができる。
ファイルシステム関連の高度な操作が必要な場合は、QFileInfo, QDirを利用する。

継承親子関係:QObject > QIODevice > QFileDevice > QFile

QFile Class | Qt Core 5.15.15

基本的な機能

ファイルの指定

QFile file("/dir/test.txt");
QFile file;
file.setFileName("/dir/test.txt");
QFile file;
QDir::setCurrent("/dir");
file.setFileName("test.txt");

ファイルパス内の区切り文字は、OSに関わらず”/”を使用する。バックスラッシュ等は使用不可。

file.fileName();    // 設定されているファイル名を返す(QString型)

ファイルの存在確認

QFile file("test.txt");
file.exists(); // ファイルが存在する場合true, 存在しない場合false を返す

ファイルを開く

file.open();    // 成功した場合はtrue、失敗した場合はfalseを返す

QIODeviceクラスのオープンモードフラグを利用しファイルを開くモードを指定する必要がある。

オープンモードフラグは、ReadOnly, WriteOnly, ReadWriteのいずれかを必ず設定する。
オプションでその他のフラグを追加することができる。

必要な読み出し・書き込みが完了したら必ずclose()でファイルを閉じる。

openMode

  • ReadOnly 読み取り可能
  • WriteOnly 書き込み可能/ファイルが存在しない場合、作成してから開く
    ReadWrite, Append, NewOnlyのいずれかと組み合わせなければTruncate扱い(全上書き)となる
  • ReadWrite 読み書き可能/ファイルが存在しない場合、作成してから開く
  • Append ファイルの末尾に書き込み
  • Truncate 上書き(元ファイルを破棄して実行みたいな感じ)
  • Text 行末の改行コードに関係がある?っぽい
    Write時は利用端末に合わせた改行、Read時は\nとなる
    テキストファイルならつけておいたほうがよさそう
  • NewOnly ファイルが存在する場合は失敗/ファイルが存在しない場合は作成してから開く
  • ExistingOnly ファイルが存在する場合は開く/ファイルが存在しない場合は失敗するため、自動でファイルを作成しない/WriteOnly, ReadWriteと組み合わせて使用する

QIODevice Class | Qt Core 5.15.15

ファイルを閉じる

file.close();

ファイルクローズの明確な効果・必要性は、まだ調べ切れていない。
(クローズシグナル発信、デバイスクローズ、オープンモード設定解除、エラー文字列のリセットなどをしているようです。もう少し深堀して理解したいところ…)

ファイルを閉じないということは「読み取り・書き込みができる状態のまま」ということ。場合によってはバグや悪意のある攻撃の対象になるかもしれない。

とりあえず、open→処理→closeというセットで使用するのが吉。

使用例

編集中

Qt – カスタムWidgetの作成

環境

Linux (Raspberry Pi3B+, Raspbian 10.13, Kernel 5.10.103-v7+)

カスタムWidgetの作成

新規クラスを作成する際、MainWindowとは別のフォームファイルとする。
Qt Designer Form ClassでオリジナルのWidgetとして作成する。

ファイル作成

新規ファイル作成ダイアログを開き、下記を選択。

  • ファイルとクラス: Qt
  • Qt Designerフォームクラス

Qt Designerフォームクラスを選択した場合、以下のファイルが作成される。

  • Qt Designerフォーム
  • C++ヘッダーファイル
  • C++ソースファイル

Qt Designerフォームクラスの初期設定

フォームテンプレートの選択

テンプレートを指定できる。
オリジナルのWidgetを作成する場合の多くはテンプレート不要なので、最低限の記述のみの状態である「Widget」を選択。

クラス名の選択

クラス名を指定する。
ヘッダーファイル名、ソースファイル名、フォームファイル名は、クラス名に合わせて自動で入力されるため、拘りのある場合以外では手動で変更しなくてよい。

ファイルを作成するフォルダパスを念のため確認しておく。

プロジェクト管理設定

追加したいプロジェクトが指定されているか確認。

バージョン管理システムを使用する場合は指定。

「完了」を押すとQt Designerフォームクラスが作成され、フォームファイルが開かれる。

カスタムWidgetのフォーム編集

フォームを編集する。

カスタムWidgetのヘッダー・ソースファイルの編集

ヘッダーファイル、ソースファイルを編集する。

カスタムWidgetの挿入

  • addWidget()で挿入したいので、カスタムWidgetを挿入するフォームファイルにLayoutsで場所を用意する。
  • 挿入予定フォームクラスのヘッダーファイルに、カスタムWidgetのヘッダーをincludeする。
  • 挿入予定フォームクラスのソースファイルに、カスタムWidgetを挿入する記述をする。
CustomWidget* widget = new CustomWidget(); // インスタンス生成
ui->mainLayout->addWidget(widget); // mainLayout内にwidgetを追加