【保存版】Qt GUI: リスト形式の判定と操作を網羅! QTextFormat::isListFormat()の使い方


QTextFormat::isListFormat() は、QTextFormat オブジェクトがリスト形式かどうかを判断する関数です。これは、QTextDocument 内のテキストの書式設定を操作する際に役立ちます。

使い方

bool isListFormat = format.isListFormat();

このコードは、format という QTextFormat オブジェクトがリスト形式かどうかを判断し、結果を isListFormat 変数に格納します。

戻り値

  • リスト形式でない場合: false
  • リスト形式の場合: true

QTextDocument document;
QTextCursor cursor = document.textCursor();

// リスト形式のテキストブロックを作成
QTextBlockFormat blockFormat;
blockFormat.setProperty(QTextBlockFormat::ListIndent, 20);
cursor.setBlockFormat(blockFormat);

// リスト形式のテキストを挿入
cursor.insertText("Item 1\nItem 2\nItem 3");

// リスト形式かどうかを確認
QTextFormat format = cursor.currentCharFormat();
bool isListFormat = format.isListFormat();

if (isListFormat) {
    qDebug() << "Current text is in list format";
} else {
    qDebug() << "Current text is not in list format";
}

この例では、リスト形式のテキストブロックを作成し、その中にテキストを挿入します。その後、QTextFormat::isListFormat() を使用して、現在のテキストがリスト形式かどうかを確認します。

  • リストの種類を判断するには、QTextListFormat クラスを使用する必要があります。
  • QTextFormat::isListFormat() は、QTextFormat オブジェクトがリスト形式かどうかを判断するだけで、リストの種類 (番号付きリスト、箇条書きリストなど) を判断するものではありません。


例1: リスト形式のテキストブロックを作成し、その中にテキストを挿入する

#include <QApplication>
#include <QTextDocument>
#include <QTextCursor>
#include <QTextBlockFormat>
#include <QDebug>

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

    // QTextDocumentを作成
    QTextDocument document;
    QTextCursor cursor = document.textCursor();

    // リスト形式のテキストブロックを作成
    QTextBlockFormat blockFormat;
    blockFormat.setProperty(QTextBlockFormat::ListIndent, 20);
    cursor.setBlockFormat(blockFormat);

    // リスト形式のテキストを挿入
    cursor.insertText("Item 1\nItem 2\nItem 3");

    // リスト形式かどうかを確認
    QTextFormat format = cursor.currentCharFormat();
    bool isListFormat = format.isListFormat();

    if (isListFormat) {
        qDebug() << "Current text is in list format";
    } else {
        qDebug() << "Current text is not in list format";
    }

    return 0;
}

例2: 既存のテキストブロックのリスト形式を確認する

#include <QApplication>
#include <QTextDocument>
#include <QTextCursor>
#include <QTextBlockFormat>
#include <QDebug>

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

    // QTextDocumentを作成
    QTextDocument document;
    QTextCursor cursor = document.textCursor();

    // 既存のテキストブロックを読み込む
    cursor.insertText("This is a normal text block.\n\nThis is a list text block.\n* Item 1\n* Item 2\n* Item 3");

    // 各テキストブロックのリスト形式を確認
    while (!cursor.atEnd()) {
        QTextFormat format = cursor.currentCharFormat();
        bool isListFormat = format.isListFormat();

        if (isListFormat) {
            qDebug() << "Current text block is in list format";
        } else {
            qDebug() << "Current text block is not in list format";
        }

        cursor.movePosition(QTextCursor::NextBlock);
    }

    return 0;
}
#include <QApplication>
#include <QTextDocument>
#include <QTextCursor>
#include <QTextBlockFormat>
#include <QDebug>

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

    // QTextDocumentを作成
    QTextDocument document;
    QTextCursor cursor = document.textCursor();

    // リスト形式のテキストブロックを作成
    QTextBlockFormat blockFormat;
    blockFormat.setProperty(QTextBlockFormat::ListIndent, 20);
    cursor.setBlockFormat(blockFormat);

    // リスト形式のテキストを挿入
    cursor.insertText("Item 1\nItem 2\nItem 3");

    // リスト形式を解除
    cursor.movePosition(QTextCursor::StartOfBlock);
    cursor.setBlockFormat(QTextBlockFormat());

    // リスト形式が解除されたことを確認
    QTextFormat format = cursor.currentCharFormat();
    bool isListFormat = format.isListFormat();

    if (isListFormat) {
        qDebug() << "Current text is in list format"; // この行は実行されません
    } else {
        qDebug() << "Current text is not in list format";
    }

    return 0;
}


QTextBlockFormat::isValid() を使用する

QTextBlockFormat::isValid() は、QTextBlockFormat オブジェクトが有効かどうかを判断する関数です。リスト形式のテキストブロックの場合、QTextBlockFormat::isValid()true を返します。

利点

  • リスト形式のテキストブロックかどうかを直接判断できます。
  • QTextFormat::isListFormat() よりも高速に処理できる可能性があります。

欠点

  • QTextFormat オブジェクトではなく、QTextBlockFormat オブジェクトが必要になります。
  • リストの種類 (番号付きリスト、箇条書きリストなど) を判断できません。


QTextDocument document;
QTextCursor cursor = document.textCursor();

// 既存のテキストブロックを読み込む
cursor.insertText("This is a normal text block.\n\nThis is a list text block.\n* Item 1\n* Item 2\n* Item 3");

// 各テキストブロックのリスト形式を確認
while (!cursor.atEnd()) {
    QTextBlockFormat blockFormat = cursor.currentBlockFormat();
    if (blockFormat.isValid()) {
        qDebug() << "Current text block is in list format";
    } else {
        qDebug() << "Current text block is not in list format";
    }

    cursor.movePosition(QTextCursor::NextBlock);
}

QTextCharFormat::property(QTextFormat::ListIndent) を使用する

QTextCharFormat::property(QTextFormat::ListIndent) は、QTextFormat オブジェクトのリストインデント値を取得する関数です。リスト形式のテキストの場合、リストインデント値は 0 より大きい値になります。

利点

  • リストの種類 (番号付きリスト、箇条書きリストなど) に関係なく、リスト形式かどうかを判断できます。

欠点

  • リストインデント値が 0 の場合、リスト形式かどうかを判断できません。
  • QTextFormat::isListFormat() よりも処理速度が遅くなる可能性があります。


QTextDocument document;
QTextCursor cursor = document.textCursor();

// 既存のテキストブロックを読み込む
cursor.insertText("This is a normal text block.\n\nThis is a list text block.\n* Item 1\n* Item 2\n* Item 3");

// 各テキストブロックのリスト形式を確認
while (!cursor.atEnd()) {
    QTextFormat format = cursor.currentCharFormat();
    int listIndent = format.property(QTextFormat::ListIndent).toInt();

    if (listIndent > 0) {
        qDebug() << "Current text block is in list format";
    } else {
        qDebug() << "Current text block is not in list format";
    }

    cursor.movePosition(QTextCursor::NextBlock);
}

QRegExp を使用する

QRegExp を使用して、リスト形式のテキストのパターンを検索することもできます。この方法は、より柔軟な判断が可能ですが、正規表現の知識が必要になります。

利点

  • 独自のリスト形式のパターンを定義できます。

欠点

  • 処理速度が遅くなる可能性があります。
  • 正規表現の知識が必要になります。
QTextDocument document;
QTextCursor cursor = document.textCursor();

// 既存のテキストブロックを読み込む
cursor.insertText("This is a normal text block.\n\nThis is a list text block.\n* Item 1\n* Item 2\n* Item 3");

// 各テキストブロックのリスト形式を確認
QRegExp listRegExp("^\\*"); // 番号付きリストのパターン

while (!cursor.atEnd()) {
    QTextFormat format = cursor.currentCharFormat();
    QString text = cursor.selectedText();

    if (listRegExp.match(text)) {
        qDebug() << "Current text block is in list format";
    } else {
        qDebug() << "Current text block is not in list format";
    }

    cursor.movePosition(QTextCursor::NextBlock);
}