QTextStream::fieldAlignment()

2025-05-26

具体的には、以下のいずれかの値を返します。

  • QTextStream::AlignTrailing: 数値の場合、符号や基数プレフィックスが数値の直前に表示され、全体が右寄せされます。文字列の場合はAlignRightと同じです。
  • QTextStream::AlignLeading: 数値の場合、符号や基数プレフィックス(例: "0x")がフィールドの先頭に表示され、残りの部分は右寄せされます。文字列の場合はAlignLeftと同じです。
  • QTextStream::AlignCenter: フィールドが中央揃えで整列されます。
  • QTextStream::AlignRight: フィールドが右寄せで整列されます。
  • QTextStream::AlignLeft: フィールドが左寄せで整列されます(デフォルト)。

この設定は、QTextStream::setFieldAlignment()関数を使って変更できます。また、QTextStream::fieldWidth()と組み合わせて使用することで、指定した幅の中でテキストをどのように配置するかを細かく制御できます。

#include <QTextStream>
#include <QString>
#include <QDebug> // デバッグ出力用

int main() {
    QString output;
    QTextStream stream(&output);

    // デフォルトは左寄せ
    stream << "Hello" << qSetFieldWidth(10) << "World" << "\n"; // "Hello     World"

    // 右寄せに設定
    stream.setFieldAlignment(QTextStream::AlignRight);
    stream << "Hello" << qSetFieldWidth(10) << "World" << "\n"; // "Hello     World" (最初のHelloは影響を受けない)
    stream << qSetFieldWidth(10) << "Hello" << qSetFieldWidth(10) << "World" << "\n"; // "     Hello     World"

    // 中央揃えに設定
    stream.setFieldAlignment(QTextStream::AlignCenter);
    stream << qSetFieldWidth(10) << "Hello" << qSetFieldWidth(10) << "World" << "\n"; // "  Hello    World "

    // 出力結果を表示
    qDebug() << output;

    return 0;
}


ここでは、QTextStream::fieldAlignment()に関連する一般的な落とし穴と、それらのトラブルシューティング方法を説明します。

setFieldWidth() との組み合わせの誤解

よくある間違い
setFieldAlignment()は、setFieldWidth()で設定されたフィールド幅の中でテキストを整列します。setFieldWidth()が設定されていない場合や、フィールド幅がテキストの長さよりも短い場合、整列は期待通りに機能しないことがあります。

  • フィールド幅がテキストの長さより短い場合
    テキストは切り捨てられたり、期待通りの整列にならないことがあります。QTextStreamは、指定されたフィールド幅に収まらない場合、テキストを切り詰めることはありません。代わりに、フィールド幅が無視され、テキスト全体が出力されます。
  • フィールド幅が設定されていない場合
    fieldAlignment()は効果を発揮しません。テキストは単にそのまま出力されます。

トラブルシューティング

  • 十分なフィールド幅を確保する
    出力するテキストの最大長を考慮し、それに見合ったフィールド幅を設定します。
  • qSetFieldWidth()マニピュレータを常に使用する
    setFieldAlignment()を設定したフィールドに対しては、必ずqSetFieldWidth()マニピュレータを使って明示的にフィールド幅を設定してください。


#include <QTextStream>
#include <QString>
#include <QDebug>

int main() {
    QString output;
    QTextStream stream(&output);

    stream.setFieldAlignment(QTextStream::AlignRight);

    // 誤った例: fieldWidthが設定されていないため、AlignRightは効果がない
    stream << "Hello" << "World" << "\n"; // "HelloWorld"

    // 誤った例: fieldWidthが短すぎるため、AlignRightの効果が分かりにくい
    stream << qSetFieldWidth(3) << "LongText" << "\n"; // "LongText" (切り詰められない)

    // 正しい例: fieldWidthを設定することで、AlignRightが機能する
    stream << qSetFieldWidth(10) << "Hello" << "\n"; // "     Hello"

    qDebug() << output;
    return 0;
}

QTextStreamの状態がリセットされていない

よくある間違い
QTextStreamは、一度setFieldAlignment()setFieldWidth()を設定すると、明示的に変更しない限りその設定を保持します。これにより、以前の出力での設定が次の出力に影響を与え、意図しない整列になることがあります。

トラブルシューティング

  • 明示的なリセット
    グローバルな設定を一時的に変更したい場合は、変更後に元の設定に戻すか、stream.reset()を呼び出して全ての書式設定をデフォルトに戻すことを検討してください。ただし、reset()fieldAlignmentだけでなく、fieldWidthpadCharなど、すべての書式設定をリセットすることに注意してください。
  • マニピュレータの活用
    qSetFieldAlignment()qSetFieldWidth()のようなマニピュレータを使用すると、それらが適用されるストリーム演算子の直後の要素にのみ設定が適用され、次の要素には影響を与えません。これは、一時的な書式設定に便利です。


#include <QTextStream>
#include <QString>
#include <QDebug>

int main() {
    QString output;
    QTextStream stream(&output);

    // 最初の行は右寄せ
    stream.setFieldAlignment(QTextStream::AlignRight);
    stream << qSetFieldWidth(10) << "Data1" << "\n"; // "     Data1"

    // 意図しない例: 左寄せに戻すのを忘れると、次の行も右寄せになる
    stream << qSetFieldWidth(10) << "Data2" << "\n"; // "     Data2"

    // 正しい例: マニピュレータを使って一時的に設定するか、明示的にリセットする
    stream << qSetFieldAlignment(QTextStream::AlignLeft) << qSetFieldWidth(10) << "Data3" << "\n"; // "Data3     "

    // reset()で全ての書式設定をデフォルトに戻す
    stream.reset();
    stream << qSetFieldWidth(10) << "Data4" << "\n"; // "Data4     " (デフォルトは左寄せ)

    qDebug() << output;
    return 0;
}

数値と文字列の整列の違い

よくある間違い
QTextStream::AlignLeadingQTextStream::AlignTrailingは、数値の出力時に特に意味を持ちます。これらの整列モードが文字列に適用された場合、期待通りの結果にならないことがあります。

  • AlignTrailing (文字列)
    AlignRightと同じ動作をします。
  • AlignLeading (文字列)
    AlignLeftと同じ動作をします。

トラブルシューティング

  • 意図を明確にする
    文字列にはAlignLeftAlignRightAlignCenterを使用し、数値の特定の書式設定が必要な場合にのみAlignLeadingAlignTrailingを検討してください。

よくある間違い
fieldAlignment()自体は文字コードに直接関係しませんが、QTextStream全体の動作が文字コードやロケールの影響を受けることがあります。特に、全角文字を含む文字列を扱う場合、フィールド幅の計算が意図と異なることがあります。QTextStreamは内部的にUnicodeを使用しますが、バイト数と文字数の違いで見た目の整列が崩れることがあります。

トラブルシューティング

  • ロケール設定の確認
    特定の数値や日付の書式設定で問題がある場合は、QTextStream::setLocale()でロケールが適切に設定されているか確認してください。
  • 文字数で幅を計算する
    全角文字が含まれる可能性がある場合、バイト数ではなく文字数でフィールド幅を計算するロジックを検討する必要があるかもしれません。ただし、QTextStreamsetFieldWidth()は基本的に表示される文字数に基づいて動作するため、通常は問題ありません。

QTextStream::fieldAlignment()のトラブルシューティングの鍵は、以下の点を理解することです。

  1. setFieldWidth()との密接な関係
    整列はフィールド幅が設定されて初めて意味を持ちます。
  2. ストリームの状態管理
    QTextStreamは設定を保持するため、意図しない設定が次の出力に影響を与えないように注意が必要です。マニピュレータを使うか、必要に応じてリセットを検討してください。
  3. 各整列モードの特性
    特に数値と文字列で動作が異なるモードがあることを理解してください。


QTextStream::fieldAlignment() は、QTextStream::setFieldAlignment() 関数で設定され、qSetFieldAlignment() マニピュレータを使って一時的に設定することもできます。整列は、QTextStream::setFieldWidth() または qSetFieldWidth() で指定されたフィールド幅の中で行われます。

必要なヘッダーファイル

#include <QTextStream> // QTextStream クラス用
#include <QString>     // 文字列操作用
#include <QDebug>      // デバッグ出力用 (qDebug() を使う場合)

例1: 基本的な整列 (左寄せ、右寄せ、中央揃え)

この例では、最も一般的な3つの整列オプション (AlignLeft, AlignRight, AlignCenter) の違いを示します。

#include <QTextStream>
#include <QString>
#include <QDebug>

int main() {
    QString output;
    QTextStream stream(&output);

    // 各行でフィールド幅を15に設定

    // 1. デフォルト (左寄せ)
    stream << "--- デフォルト (左寄せ) ---" << "\n";
    stream << qSetFieldWidth(15) << "Item A" << "\n";
    stream << qSetFieldWidth(15) << "Longer Item B" << "\n";
    stream << qSetFieldWidth(15) << "X" << "\n";

    // 2. 右寄せ (AlignRight)
    stream << "--- 右寄せ (AlignRight) ---" << "\n";
    stream.setFieldAlignment(QTextStream::AlignRight); // ストリーム全体に設定
    stream << qSetFieldWidth(15) << "Item A" << "\n";
    stream << qSetFieldWidth(15) << "Longer Item B" << "\n";
    stream << qSetFieldWidth(15) << "X" << "\n";
    stream.setFieldAlignment(QTextStream::AlignLeft); // 元に戻すか、次の設定のためにリセット

    // 3. 中央揃え (AlignCenter)
    stream << "--- 中央揃え (AlignCenter) ---" << "\n";
    stream.setFieldAlignment(QTextStream::AlignCenter); // ストリーム全体に設定
    stream << qSetFieldWidth(15) << "Item A" << "\n";
    stream << qSetFieldWidth(15) << "Longer Item B" << "\n";
    stream << qSetFieldWidth(15) << "X" << "\n";
    stream.setFieldAlignment(QTextStream::AlignLeft); // 元に戻す

    qDebug() << output;

    /* 期待される出力例:
    "--- デフォルト (左寄せ) ---"
    "Item A         "
    "Longer Item B  "
    "X              "
    "--- 右寄せ (AlignRight) ---"
    "         Item A"
    "  Longer Item B"
    "              X"
    "--- 中央揃え (AlignCenter) ---"
    "    Item A     "
    " Longer Item B "
    "      X        "
    */

    return 0;
}

例2: マニピュレータ qSetFieldAlignment() の使用

setFieldAlignment() はストリームの状態を変更しますが、qSetFieldAlignment() マニピュレータは、そのマニピュレータが適用される次の要素にのみ影響を与え、ストリームの状態を永続的に変更しません。これは、一時的な書式設定に非常に便利です。

#include <QTextStream>
#include <QString>
#include <QDebug>

int main() {
    QString output;
    QTextStream stream(&output);

    // デフォルトは左寄せ

    // 左寄せのまま
    stream << qSetFieldWidth(10) << "Left" << "\n"; // "Left      "

    // 次の要素を右寄せにする(一時的)
    stream << qSetFieldAlignment(QTextStream::AlignRight) << qSetFieldWidth(10) << "Right" << "\n"; // "     Right"

    // ストリームのフィールドアライメントはまだデフォルトの左寄せ
    stream << qSetFieldWidth(10) << "BackLeft" << "\n"; // "BackLeft  "

    // 複数要素を同時に整列
    stream << qSetFieldAlignment(QTextStream::AlignCenter)
           << qSetFieldWidth(10) << "Center1"
           << qSetFieldWidth(10) << "Center2" << "\n"; // " Center1    Center2  "

    qDebug() << output;

    /* 期待される出力例:
    "Left      "
    "     Right"
    "BackLeft  "
    " Center1  Center2 "
    */

    return 0;
}

例3: 数値の整列 (AlignLeadingAlignTrailing)

AlignLeadingAlignTrailing は、主に数値の出力において、符号や基数プレフィックス (0x, 0b など) の位置を制御するために使用されます。文字列に対してこれらのアラインメントを使用しても、それぞれ AlignLeftAlignRight と同じ動作になります。

#include <QTextStream>
#include <QString>
#include <QDebug>

int main() {
    QString output;
    QTextStream stream(&output);

    double value = 123.45;
    int hexValue = 0xAF;

    // 1. AlignLeft (デフォルト)
    stream << "--- AlignLeft (デフォルト) ---" << "\n";
    stream << qSetFieldWidth(15) << value << "\n";
    stream << qSetFieldWidth(15) << hexValue << "\n";
    stream << qSetFieldWidth(15) << "String" << "\n";

    // 2. AlignRight
    stream << "--- AlignRight ---" << "\n";
    stream.setFieldAlignment(QTextStream::AlignRight);
    stream << qSetFieldWidth(15) << value << "\n";
    stream << qSetFieldWidth(15) << hexValue << "\n";
    stream << qSetFieldWidth(15) << "String" << "\n";
    stream.setFieldAlignment(QTextStream::AlignLeft); // リセット

    // 3. AlignLeading
    // 数値: 符号/プレフィックスが先頭に、残りの数値は右寄せ
    // 文字列: AlignLeft と同じ
    stream << "--- AlignLeading ---" << "\n";
    stream.setFieldAlignment(QTextStream::AlignLeading);
    stream << qSetFieldWidth(15) << value << "\n";
    stream << qSetFieldWidth(15) << hexValue << "\n"; // 0x を含めて右寄せ
    stream << qSetFieldWidth(15) << QString("0x") + QString::number(hexValue, 16).toUpper() << "\n"; // プレフィックスを明示的に出力
    stream << qSetFieldWidth(15) << "String" << "\n";
    stream.setFieldAlignment(QTextStream::AlignLeft); // リセット

    // 4. AlignTrailing
    // 数値: 符号/プレフィックスが数値の直前に、全体が右寄せ
    // 文字列: AlignRight と同じ
    stream << "--- AlignTrailing ---" << "\n";
    stream.setFieldAlignment(QTextStream::AlignTrailing);
    stream << qSetFieldWidth(15) << value << "\n";
    stream << qSetFieldWidth(15) << hexValue << "\n"; // 0x が数値の直前
    stream << qSetFieldWidth(15) << QString("0x") + QString::number(hexValue, 16).toUpper() << "\n";
    stream << qSetFieldWidth(15) << "String" << "\n";
    stream.setFieldAlignment(QTextStream::AlignLeft); // リセット

    qDebug() << output;

    /* 期待される出力例 (一部抜粋):
    "--- AlignLeading ---"
    "         123.45" // 符号なしなのでAlignRightと同じ
    "            0xaf" // 0x が先頭に、残りが右寄せ
    "0xAF           " // 文字列なのでAlignLeft
    "--- AlignTrailing ---"
    "         123.45" // 符号なしなのでAlignRightと同じ
    "            0xaf" // 0x が数値の直前で、全体が右寄せ
    "         0xAF" // 文字列なのでAlignRight
    */

    return 0;
}

例4: テーブル形式の出力への応用

fieldAlignment() は、データが列に整列されたテーブル形式の出力を生成する際に非常に役立ちます。

#include <QTextStream>
#include <QString>
#include <QDebug>
#include <QVector>

struct Product {
    QString name;
    double price;
    int quantity;
};

int main() {
    QString output;
    QTextStream stream(&output);

    QVector<Product> products = {
        {"Apple", 1.20, 150},
        {"Banana", 0.75, 200},
        {"Orange", 1.50, 80},
        {"Very Long Product Name", 5.99, 10}
    };

    // ヘッダー行
    stream << qSetFieldAlignment(QTextStream::AlignLeft) << qSetFieldWidth(25) << "Product Name"
           << qSetFieldAlignment(QTextStream::AlignRight) << qSetFieldWidth(10) << "Price"
           << qSetFieldAlignment(QTextStream::AlignRight) << qSetFieldWidth(10) << "Quantity"
           << "\n";
    stream << QString(45, '-') << "\n"; // 区切り線

    // データ行
    for (const auto& product : products) {
        stream << qSetFieldAlignment(QTextStream::AlignLeft) << qSetFieldWidth(25) << product.name
               << qSetFieldAlignment(QTextStream::AlignRight) << qSetFieldWidth(10) << QString::number(product.price, 'f', 2) // 価格を2桁の小数点で
               << qSetFieldAlignment(QTextStream::AlignRight) << qSetFieldWidth(10) << product.quantity
               << "\n";
    }

    qDebug() << output;

    /* 期待される出力例:
    "Product Name             Price   Quantity"
    "---------------------------------------------"
    "Apple                     1.20        150"
    "Banana                    0.75        200"
    "Orange                    1.50         80"
    "Very Long Product Name    5.99         10"
    */

    return 0;
}


QString::arg() とパディング

QString::arg() は、Qt で文字列をフォーマットする際の最も一般的で強力な方法の一つです。数値や他の文字列をプレースホルダー (%1, %2 など) に挿入できます。フィールド幅とパディング文字を指定することで、QTextStreamfieldAlignment() と同様の整列効果を得ることができます。

  • 中央揃え
    QString("%1").arg(text.trimmed().center(width, ' '))
  • 右寄せ
    QString("%1").arg(text, -width, QChar(' ')) (負の幅は右寄せを意味します)
  • 左寄せ
    QString("%1").arg(text, width, QChar(' '))


#include <QString>
#include <QDebug>

int main() {
    QString s;
    int width = 15;

    // 左寄せ (デフォルト)
    s = QString("Item A: %1").arg("Value1", width, QChar(' '));
    qDebug() << s; // "Item A: Value1         "

    // 右寄せ
    s = QString("Item B: %1").arg("Value2", -width, QChar(' ')); // 負の幅で右寄せ
    qDebug() << s; // "Item B:         Value2"

    // 中央揃え (少し複雑)
    // まず文字列を中央揃えにしてから、arg() で幅を指定
    QString centerText = "Value3";
    s = QString("Item C: %1").arg(centerText.center(width), -width, QChar(' '));
    qDebug() << s; // "Item C:      Value3     " (右寄せでなく中央揃えに合わせるため、arg()の幅は負でも良いが、中央揃えの関数を使う)
    // または、より直接的に:
    s = QString("Item C: %1").arg(centerText.trimmed().center(width, QChar(' ')));
    qDebug() << s; // "Item C:      Value3     "


    // 数値のフォーマットも可能
    double price = 123.45;
    s = QString("Price: %1").arg(QString::number(price, 'f', 2), -10, QChar(' '));
    qDebug() << s; // "Price:      123.45"

    return 0;
}

利点

  • C++ の printf ライクな書式指定よりも型安全です。
  • コードが簡潔になることが多いです。
  • QTextStream オブジェクトを必要とせず、単一の文字列を生成するのに適しています。

欠点

  • 特に中央揃えの場合、文字列の準備が少し手間がかかります。

QString::leftJustified(), rightJustified(), setNum() など

QString には、直接的に文字列のパディングや整列を行うための便利な関数も提供されています。

  • QString::number(): 数値から文字列への変換時に、精度や基数などを指定できます。これ自体には整列機能はありませんが、leftJustified()rightJustified() と組み合わせられます。
  • QString::rightJustified(width, fillChar, truncate): 指定された幅で右寄せし、必要に応じてパディングまたは切り捨てを行います。
  • QString::leftJustified(width, fillChar, truncate): 指定された幅で左寄せし、必要に応じてパディングまたは切り捨てを行います。


#include <QString>
#include <QDebug>

int main() {
    QString text = "Hello";
    int width = 10;

    qDebug() << text.leftJustified(width, QChar('-'));  // "Hello-----"
    qDebug() << text.rightJustified(width, QChar('*')); // "*****Hello"

    QString longText = "VeryLongText";
    qDebug() << longText.leftJustified(5, QChar(' '), true); // "VeryL" (切り捨て)

    double value = 123.45;
    QString formattedValue = QString::number(value, 'f', 2); // "123.45"
    qDebug() << formattedValue.rightJustified(10, QChar(' ')); // "    123.45"

    return 0;
}

利点

  • 単一の文字列を特定の方法でパディング・整列するのに非常に直接的です。

欠点

C++ 標準ライブラリのストリーム (<iomanip>)

Qt に依存しない C++ 標準ライブラリの iostream を使用する場合、<iomanip> ヘッダーに含まれるマニピュレータを使って同様の書式設定が可能です。

  • std::setfill(char): パディング文字を設定します。
  • std::left, std::right, std::internal: 整列方法を設定します。
  • std::setw(width): フィールド幅を設定します。


#include <iostream>
#include <string>
#include <iomanip> // setw, left, right, setfill 用

int main() {
    std::cout << "--- C++ Standard Library ---" << std::endl;

    // 左寄せ (デフォルト)
    std::cout << std::left << std::setw(15) << "Item A" << std::endl;

    // 右寄せ
    std::cout << std::right << std::setw(15) << "Item B" << std::endl;

    // 中央揃え (直接的なマニピュレータはないため、手動で計算)
    std::string s_center = "Item C";
    int width = 15;
    int pad = width - s_center.length();
    int padLeft = pad / 2;
    int padRight = pad - padLeft;
    std::cout << std::setfill(' ') << std::left << std::setw(padLeft) << ""
              << std::setw(s_center.length()) << s_center
              << std::setw(padRight) << "" << std::endl;

    // パディング文字の変更
    std::cout << std::setfill('*') << std::right << std::setw(15) << "Value" << std::endl;

    // 標準の精度設定
    double price = 123.456;
    std::cout << std::fixed << std::setprecision(2) << std::right << std::setw(10) << price << std::endl;

    return 0;
}

利点

  • 既存の C++ コードベースに統合しやすいです。
  • Qt フレームワークに依存しない、純粋な C++ のアプローチです。

欠点

  • 全角文字などのUnicode文字の幅の扱いは、環境や標準ライブラリの実装に依存する場合があります(Qt の QString はその点でより堅牢です)。
  • 中央揃えのような複雑な整列は手動計算が必要になり、コードが冗長になることがあります。
  • QTextStream と同様にストリームの状態を保持するため、注意が必要です。

C++20 の std::format (または fmt ライブラリ)

C++20 で導入された std::format (これは人気の fmt ライブラリに基づいています) は、Python の f-string や C# の複合書式指定文字列に似た、強力で型安全な文字列フォーマット機能を提供します。これを使うと、整列も非常に簡潔に記述できます。


#if __cplusplus >= 202002L // C++20 以降の場合のみ
#include <iostream>
#include <string>
#include <format> // C++20 std::format 用

int main() {
    // 左寄せ (デフォルト)
    std::cout << std::format("{:<15}", "Item A") << std::endl; // "<" は左寄せ

    // 右寄せ
    std::cout << std::format("{:>15}", "Item B") << std::endl; // ">" は右寄せ

    // 中央揃え
    std::cout << std::format("{:^15}", "Item C") << std::endl; // "^" は中央揃え

    // パディング文字の指定
    std::cout << std::format("{:*^15}", "Padded") << std::endl; // ":" の後にパディング文字

    // 数値のフォーマット
    double price = 123.456;
    std::cout << std::format("{:>10.2f}", price) << std::endl; // .2f で小数点以下2桁

    // 複数の引数
    std::cout << std::format("{:<10} {:>10} {:^10}", "Name", "Score", "Rank") << std::endl;
    std::cout << std::format("{:<10} {:>10} {:^10}", "Alice", 95, 1) << std::endl;

    return 0;
}
#else
// C++20 未満の場合は fmt ライブラリを別途導入する必要があるか、他の方法を使う
#warning "C++20 std::format requires C++20 or later. Using older C++ standard."
#endif

利点

  • パフォーマンス
    通常、iostream より高速です。
  • 読みやすい構文
    Python や C# のフォーマットに慣れている開発者にとって直感的です。
  • 型安全
    コンパイル時に型チェックが行われます。
  • 非常に強力で柔軟
    ほとんどのフォーマット要件を簡潔に記述できます。

欠点

  • Qt の QString と直接連携させるには、変換が必要になる場合があります(QString::toStdString() など)。
  • C++20 以降の標準が必要なため、古いコンパイラや環境では利用できません(その場合は fmt ライブラリをプロジェクトに追加する必要があります)。

もしテキストの整列がGUI要素の表示に関連しているのであれば、各ウィジェットが提供するアラインメントプロパティやデリゲートを使用するのが適切です。

  • QTableWidget / QTreeView など (モデル/ビューフレームワーク)
    • 表示ロール (DisplayRole)
      QStandardItem やカスタムモデルの data() メソッドで、整列済みの文字列を返すようにします。これは、QTextStream::fieldAlignment() で作成した文字列を適用するのと似ています。
    • 整列ロール (TextAlignmentRole)
      QStandardItem やカスタムモデルの data() メソッドで、Qt::TextAlignmentRole を使って Qt::Alignment フラグを返すと、ビューがそのアラインメントでテキストを描画します。これはより推奨される方法です。
    • カスタムデリゲート
      QStyledItemDelegate を継承し、paint() メソッドをオーバーライドすることで、セルの描画を完全に制御し、複雑な整列や書式設定を実現できます。
  • QLabel
    QLabel::setAlignment(Qt::Alignment) を使用します。Qt::AlignLeft, Qt::AlignRight, Qt::AlignCenter などのフラグを使用できます。

例 (QLabel)

#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QVBoxLayout>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QLabel *labelLeft = new QLabel("Left Aligned Text");
    labelLeft->setAlignment(Qt::AlignLeft);
    labelLeft->setFrameStyle(QFrame::Box | QFrame::Sunken); // 境界線を表示
    layout->addWidget(labelLeft);

    QLabel *labelRight = new QLabel("Right Aligned Text");
    labelRight->setAlignment(Qt::AlignRight);
    labelRight->setFrameStyle(QFrame::Box | QFrame::Sunken);
    layout->addWidget(labelRight);

    QLabel *labelCenter = new QLabel("Center Aligned Text");
    labelCenter->setAlignment(Qt::AlignCenter);
    labelCenter->setFrameStyle(QFrame::Box | QFrame::Sunken);
    layout->addWidget(labelCenter);

    window.setLayout(layout);
    window.setWindowTitle("QLabel Alignment Example");
    window.show();

    return a.exec();
}

利点

  • ユーザーインターフェースのデザインと一貫性を保ちやすいです。
  • GUI要素の表示に特化しており、ウィジェットの描画パイプラインに自然に統合されます。

欠点

  • ファイル出力やコンソール出力など、GUIとは関係ないテキスト整形には使えません。

QTextStream::fieldAlignment() はファイルやコンソールなどへの整形されたテキスト出力には非常に便利ですが、Qt や C++ の他の場所で文字列の整列が必要な場合、上記のような代替手段を検討すると良いでしょう。

  • Qt に依存しない汎用的なストリーム出力
    C++ 標準ライブラリの <iomanip> を使用。
  • GUI 要素の表示
    各ウィジェットのアラインメントプロパティや、モデル/ビューフレームワークの整列ロール/デリゲートを使用。
  • 複雑な文字列フォーマット、特に C++20 以降
    std::format (または fmt ライブラリ) が最も強力で推奨されるアプローチ。
  • 単一の文字列生成やシンプルな整形
    QString::arg()QString::leftJustified()/rightJustified() が便利。