【Qtプログラミング】QTextEditのテキスト挿入メソッド総まとめ:insertPlainText()の代替手段も

2025-05-27

QTextEdit は、Qtフレームワークが提供するウィジェットの一つで、リッチテキストとプレーンテキストの両方を表示・編集できるテキストエディタです。このQTextEditクラスのメンバー関数である insertPlainText() は、その名の通り、現在のカーソル位置に指定されたプレーンテキストを挿入するための関数です。

  • 選択範囲の置換
    もしQTextEdit内でテキストが選択されている場合、insertPlainText()を呼び出すと、その選択されたテキストが新しく挿入されるテキストに置き換えられます。これは、通常のテキストエディタでテキストを貼り付ける動作に似ています。
  • カーソル位置の更新
    テキストが挿入された後、カーソルは挿入されたテキストの末尾に移動します。
  • 書式の影響なし
    insertPlainText()は、テキストに太字、斜体、色などの書式設定を適用しません。既存のテキストの書式も変更せず、新しいテキストは挿入された時点のカーソル位置の書式(またはデフォルトの書式)を引き継ぎます。
  • プレーンテキストの挿入
    引数として渡されたQString(テキスト文字列)を、QTextEditウィジェット内で現在カーソルがある位置に、書式情報を持たない純粋なテキストとして挿入します。

使用例

例えば、ボタンがクリックされたときに、QTextEditに特定の文字列を追加したい場合などに使用できます。

#include <QtWidgets/QApplication>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

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

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

    QTextEdit *textEdit = new QTextEdit();
    textEdit->setPlainText("これは初期テキストです。\n"); // 初期テキストを設定

    QPushButton *button = new QPushButton("テキストを挿入");

    // ボタンがクリックされたらテキストを挿入する
    QObject::connect(button, &QPushButton::clicked, [=]() {
        textEdit->insertPlainText("新しいテキストが挿入されました。\n");
    });

    layout->addWidget(textEdit);
    layout->addWidget(button);

    window->setWindowTitle("QTextEdit::insertPlainText の例");
    window->show();

    return a.exec();
}

このコードでは、"テキストを挿入"ボタンをクリックすると、textEditの現在のカーソル位置に"新しいテキストが挿入されました。\n"という文字列が追加されます。

insertPlainText() と insertHtml() の違い

QTextEditには insertHtml() という似た関数もあります。

  • insertHtml(): HTML形式のテキスト(タグや書式情報を含む)を挿入します。これにより、挿入されるテキストに太字、色、リストなどのリッチテキストの書式を適用できます。
  • insertPlainText(): 書式なしの純粋なテキストを挿入します。


パフォーマンスの問題(大量のテキスト挿入時)

問題
非常に大量のテキスト(例: 数十万行以上)をinsertPlainText()で連続して挿入しようとすると、アプリケーションがフリーズしたり、非常に遅くなったりすることがあります。これは、テキストの挿入ごとにQTextEditがレイアウトを再計算したり、再描画したりするためです。

トラブルシューティング

  • QPlainTextEdit の検討
    もし、リッチテキストの機能が不要で、プレーンテキストの表示・編集のみが必要であれば、QPlainTextEditの使用を検討してください。QPlainTextEditQTextEditよりもプレーンテキストの扱いに特化しており、大量のテキストや行数の多いファイルに対してより高いパフォーマンスを発揮するように設計されています。

  • QTextCursor を使用して効率的に操作する
    QTextEditの内部ではQTextCursorがテキスト操作を管理しています。insertPlainText()も内部的にカーソルを移動させますが、より複雑な操作(例: 途中に挿入しつつ選択範囲を保持するなど)が必要な場合は、明示的にQTextCursorを取得して操作することで、より制御された形でパフォーマンスを最適化できる場合があります。 ただし、単純な末尾への追記であればinsertPlainText()で十分な場合が多いです。

  • setUpdatesEnabled(false) / setUpdatesEnabled(true) の利用
    大量のテキストを一度に挿入する前にtextEdit->setUpdatesEnabled(false);を呼び出し、挿入が完了した後にtextEdit->setUpdatesEnabled(true);を呼び出すことで、中間的な再描画を抑制し、パフォーマンスを大幅に向上させることができます。

    textEdit->setUpdatesEnabled(false); // 更新を一時停止
    for (int i = 0; i < 100000; ++i) {
        textEdit->insertPlainText(QString("Line %1\n").arg(i));
    }
    textEdit->setUpdatesEnabled(true);  // 更新を再開
    

カーソル位置の意図しない移動

問題
insertPlainText()は現在のカーソル位置にテキストを挿入し、カーソルを挿入されたテキストの末尾に移動させます。これにより、意図しない場所にテキストが挿入されたり、ユーザーが選択していた範囲が失われたりすることがあります。

トラブルシューティング

  • 選択範囲の保持
    insertPlainText()は選択範囲を置き換えるため、選択範囲を保持したい場合は、挿入前に選択範囲を記録し、挿入後に再度選択範囲を設定する必要があります。ただし、これは複雑になるため、設計を見直す方が良い場合もあります。

  • 特定の場所への挿入
    常に末尾に追記したい場合は、事前にカーソルを末尾に移動させてからinsertPlainText()を呼び出します。

    QTextCursor cursor = textEdit->textCursor();
    cursor.movePosition(QTextCursor::End); // カーソルを末尾に移動
    textEdit->setTextCursor(cursor);
    textEdit->insertPlainText("新しい行\n");
    
  • 挿入前のカーソル位置の保存と復元
    テキスト挿入後にカーソル位置を元の場所に戻したい場合は、挿入前にQTextEdit::textCursor()で現在のカーソルを取得し、挿入後にそのカーソルを使ってQTextEdit::setTextCursor()で復元します。

    QTextCursor originalCursor = textEdit->textCursor(); // 現在のカーソルを保存
    textEdit->insertPlainText("挿入するテキスト");
    textEdit->setTextCursor(originalCursor);            // カーソルを元の位置に戻す
    

不適切な改行コードの扱い

問題
特に異なるOS間でテキストファイルを扱う場合、改行コード(CR, LF, CRLF)の扱いで問題が発生することがあります。insertPlainText()は通常、引数で与えられた文字列をそのまま挿入するため、改行コードの解釈に注意が必要です。

トラブルシューティング

  • 入力データのフィルタリング
    外部から取得したテキスト(例: シリアルポートからのデータ、ネットワーク経由のデータ)に不整合な改行コードが含まれる場合、QString::replace()などを使って挿入前に統一された改行コードに変換することを検討してください。

    QString textToInsert = "これは\r\nテスト\rテキストです。";
    textToInsert.replace("\r\n", "\n").replace("\r", "\n"); // CRLFとCRをLFに統一
    textEdit->insertPlainText(textToInsert);
    
  • 統一された改行コードの使用
    アプリケーション内で使用する改行コードを統一することをお勧めします。C++の文字列リテラルでは通常\nが使われますが、これはOSによってCRLFに変換されることもあれば、そのままLFとして扱われることもあります。 QtのQStringは内部的にUnicodeを扱いますが、insertPlainText()に渡す文字列の改行コードは、事前に目的の形式に変換しておくのが安全です。

UIスレッドのブロック

問題
insertPlainText()自体は比較的軽量な操作ですが、大量のテキスト挿入や、それに伴う再描画が頻繁に発生すると、UIスレッドがブロックされ、アプリケーションが応答しなくなることがあります。

トラブルシューティング

  • processEvents() の利用
    緊急のデバッグやシンプルなケースでは、ループ内で適度にQCoreApplication::processEvents();を呼び出すことで、UIイベントを処理し、フリーズを避けることができます。ただし、これはあくまで一時的な対策であり、根本的な解決には非同期処理の導入を検討すべきです。

    textEdit->setUpdatesEnabled(false);
    for (int i = 0; i < 100000; ++i) {
        textEdit->insertPlainText(QString("Line %1\n").arg(i));
        if (i % 1000 == 0) { // 1000行ごとにイベント処理
            QCoreApplication::processEvents();
        }
    }
    textEdit->setUpdatesEnabled(true);
    
  • 非同期処理の利用
    大量のデータをバックグラウンドで処理し、完了後にUIスレッドでinsertPlainText()を呼び出すように設計します。QThreadQtConcurrent、またはQTimerを使って小分けに挿入するなどの方法があります。

    // 例: QTimerを使って少しずつ挿入する(擬似コード)
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, [&]() {
        if (dataToInsert.isEmpty()) { // 全データ挿入済み
            timer->stop();
            return;
        }
        // 少しずつデータを挿入
        textEdit->insertPlainText(dataToInsert.takeFirst()); // リストから1行取得して挿入
    });
    timer->start(10); // 10msごとに実行
    

QTextEditがNULLポインタの場合

問題
QTextEditオブジェクトが正しく初期化されていない、または既に破棄されているにも関わらずinsertPlainText()を呼び出すと、アプリケーションがクラッシュします。

トラブルシューティング

  • オブジェクトのライフサイクル管理
    QTextEditオブジェクトがいつ作成され、いつ破棄されるのかを明確に理解し、それに応じてアクセスするようにします。特に、UIウィジェットの親子関係(ownership)に注意してください。Qtでは、親ウィジェットが破棄されると、その子ウィジェットも自動的に破棄されます。

  • NULLチェック
    QTextEditへのポインタが有効であることを常に確認してからメソッドを呼び出す習慣をつけましょう。

    if (textEdit) {
        textEdit->insertPlainText("テキスト");
    } else {
        // エラー処理、ログ出力など
    }
    


QTextEdit::insertPlainText() は、QTextEdit ウィジェットの現在のカーソル位置にプレーンテキストを挿入するための非常に便利な関数です。ここでは、いくつかの一般的な使用シナリオにおけるコード例を紹介します。

基本的なテキストの挿入

最も基本的な使い方です。ボタンがクリックされたときに、単にテキストエディタに文字列を追加します。

// mainwindow.h (例)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onInsertTextButtonClicked();

private:
    QTextEdit *textEdit;
    QPushButton *insertButton;
};

#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // QTextEdit の作成
    textEdit = new QTextEdit(this);
    textEdit->setPlainText("ここに初期テキストがあります。\n"); // 初期テキスト

    // ボタンの作成
    insertButton = new QPushButton("テキストを挿入", this);
    connect(insertButton, &QPushButton::clicked, this, &MainWindow::onInsertTextButtonClicked);

    // レイアウトの作成とウィジェットの追加
    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(textEdit);
    layout->addWidget(insertButton);

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);

    setWindowTitle("insertPlainText() の基本例");
}

MainWindow::~MainWindow()
{
}

void MainWindow::onInsertTextButtonClicked()
{
    // 現在のカーソル位置にテキストを挿入
    textEdit->insertPlainText("ボタンが押されたので新しいテキストが追加されました。\n");
}

// main.cpp
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

解説

  • スロット内で textEdit->insertPlainText() を呼び出し、指定された文字列を挿入します。新しいテキストは常に、textEdit 内の現在のカーソル位置に追加されます。
  • ボタンの clicked シグナルを onInsertTextButtonClicked スロットに接続します。
  • MainWindow クラス内に QTextEditQPushButton を作成します。

大量のテキストを効率的に挿入する

大量の行を挿入する際にパフォーマンスの問題が発生しないように、setUpdatesEnabled() を使用する例です。

// mainwindow.h (前の例と同じヘッダでOKです)

// mainwindow.cpp (onInsertTextButtonClicked を変更)
#include "mainwindow.h"
#include <QElapsedTimer> // 処理時間計測用

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    textEdit = new QTextEdit(this);
    insertButton = new QPushButton("大量のテキストを挿入", this);
    connect(insertButton, &QPushButton::clicked, this, &MainWindow::onInsertTextButtonClicked);

    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(textEdit);
    layout->addWidget(insertButton);

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);

    setWindowTitle("insertPlainText() の大量挿入例");
}

MainWindow::~MainWindow()
{
}

void MainWindow::onInsertTextButtonClicked()
{
    // 挿入開始前の時刻を記録
    QElapsedTimer timer;
    timer.start();

    // 更新を一時的に無効にする
    textEdit->setUpdatesEnabled(false);

    const int numLines = 100000; // 挿入する行数

    for (int i = 0; i < numLines; ++i) {
        textEdit->insertPlainText(QString("これはテスト行 %1 です。\n").arg(i + 1));
    }

    // 更新を再度有効にする
    textEdit->setUpdatesEnabled(true);

    // 挿入されたテキストを表示するためにスクロールバーの位置を調整(必要な場合)
    textEdit->verticalScrollBar()->setValue(textEdit->verticalScrollBar()->maximum());

    qint64 elapsed = timer.elapsed();
    qDebug() << "テキスト挿入にかかった時間:" << elapsed << "ミリ秒";
}

// main.cpp (前の例と同じでOKです)

解説

  • QElapsedTimer を使用して処理時間を計測し、効果を確認できます。
  • 大量のテキスト挿入ループが終了した後、textEdit->setUpdatesEnabled(true); を呼び出すことで、一括で更新が反映されます。これにより、UIのフリーズを防ぎ、パフォーマンスを大幅に向上させることができます。
  • textEdit->setUpdatesEnabled(false); を呼び出すことで、テキストの挿入中に QTextEdit の再描画やレイアウト計算を一時的に停止させます。

特定のカーソル位置への挿入(QTextCursor の利用)

QTextEdit のテキスト操作は、内部的に QTextCursor を介して行われます。insertPlainText() は現在のカーソル位置を使用しますが、明示的に QTextCursor を操作することで、より詳細な制御が可能です。

// mainwindow.h (前の例と同じヘッダに加えて QPushButton を追加)

// mainwindow.cpp (onInsertTextButtonClicked を変更し、新しいスロットを追加)
#include "mainwindow.h"
#include <QTextCursor> // QTextCursor を使用するために必要

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    textEdit = new QTextEdit(this);
    textEdit->setPlainText("これは初期テキストです。\nここに追加のテキストを挿入します。\n最後の行です。");

    insertButton = new QPushButton("末尾にテキストを挿入", this);
    connect(insertButton, &QPushButton::clicked, this, &MainWindow::onInsertTextAtEndClicked);

    QPushButton *insertMiddleButton = new QPushButton("中間にテキストを挿入", this);
    connect(insertMiddleButton, &QPushButton::clicked, this, &MainWindow::onInsertTextInMiddleClicked);

    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(textEdit);
    layout->addWidget(insertButton);
    layout->addWidget(insertMiddleButton); // 新しいボタンを追加

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);

    setWindowTitle("QTextCursor を使った挿入例");
}

MainWindow::~MainWindow()
{
}

void MainWindow::onInsertTextAtEndClicked()
{
    // カーソルをドキュメントの末尾に移動させる
    QTextCursor cursor = textEdit->textCursor();
    cursor.movePosition(QTextCursor::End);
    textEdit->setTextCursor(cursor); // カーソルをセットし直す

    textEdit->insertPlainText("\n--- 末尾に追加されたテキスト ---");
}

void MainWindow::onInsertTextInMiddleClicked()
{
    // 例えば、2行目の先頭にカーソルを移動してテキストを挿入
    QTextCursor cursor = textEdit->textCursor();

    // ドキュメントの先頭に移動
    cursor.movePosition(QTextCursor::Start);

    // 目的の行(例えば2行目)まで移動
    // QTextEditはブロック(段落)単位で処理されるため、行移動はブロック移動になります
    // 今回は例として2回 `movePosition(QTextCursor::NextBlock)` を呼び出す
    cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, 1); // 1つ目のブロックの終わり
    cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, 1); // 2つ目のブロックの終わり

    textEdit->setTextCursor(cursor); // 新しいカーソル位置をセット

    textEdit->insertPlainText("[中間に挿入されたテキスト]");
}

// main.cpp (前の例と同じでOKです)

解説

  • onInsertTextInMiddleClicked() では、カーソルをドキュメントの先頭から特定のブロック(段落)まで移動させています。QTextCursor::NextBlock を使用することで、行(段落)単位で移動できます。
  • textEdit->setTextCursor(cursor); で移動させたカーソルを QTextEdit にセットし直します。この後 insertPlainText() を呼び出すと、末尾にテキストが挿入されます。
  • cursor.movePosition(QTextCursor::End); でカーソルをドキュメントの末尾に移動させます。
  • onInsertTextAtEndClicked() では、まず textEdit->textCursor() で現在のカーソルを取得します。

QTextEdit::append() の利用

もし単にテキストを新しい段落として末尾に追加したいだけであれば、insertPlainText() よりも QTextEdit::append(const QString &text) の方が簡潔で意図が明確です。append() は自動的に新しい行(段落)を追加してからテキストを挿入します。

// mainwindow.h (前の例と同じヘッダに加えて QPushButton を追加)

// mainwindow.cpp (onInsertTextButtonClicked を変更し、新しいスロットを追加)
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    textEdit = new QTextEdit(this);
    textEdit->setPlainText("既存のテキストがここにあります。\n");

    insertButton = new QPushButton("insertPlainText() で追加", this);
    connect(insertButton, &QPushButton::clicked, this, &MainWindow::onInsertPlainTextClicked);

    QPushButton *appendButton = new QPushButton("append() で追加", this);
    connect(appendButton, &QPushButton::clicked, this, &MainWindow::onAppendClicked);

    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(textEdit);
    layout->addWidget(insertButton);
    layout->addWidget(appendButton); // 新しいボタンを追加

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);

    setWindowTitle("append() と insertPlainText() の比較");
}

MainWindow::~MainWindow()
{
}

void MainWindow::onInsertPlainTextClicked()
{
    // カーソル位置にそのまま挿入
    textEdit->insertPlainText("--- insertPlainText() で追加されました ---\n");
}

void MainWindow::onAppendClicked()
{
    // 新しい行(段落)としてテキストを追加
    textEdit->append("--- append() で新しい行に追加されました ---");
}

// main.cpp (前の例と同じでOKです)
  • onAppendClicked() では、append() を使用しています。これは常に新しい段落としてテキストをQTextEditの末尾に追加します。カーソル位置に関わらず、末尾に新しい行が追加されるため、ログ表示などの用途で非常に便利です。
  • onInsertPlainTextClicked() では、現在のカーソル位置にテキストを挿入し、明示的に改行文字 \n を追加しています。カーソルがテキストの途中にある場合、そこに挿入されます。


QTextEdit は非常に多機能なテキストエディタであり、テキストの挿入方法も複数提供されています。用途に応じて最適な方法を選択することが重要です。

void QTextEdit::append(const QString &text)

目的
新しい段落としてテキストを常に末尾に追加したい場合。

説明
append() は、QTextEdit のドキュメントの末尾に、新しいブロック(段落)として指定されたテキストを追加します。insertPlainText() とは異なり、明示的に改行文字 (\n) を含める必要がなく、現在のカーソル位置に影響を受けません。ログ表示やチャットアプリケーションのように、常に最新のテキストを一番下に追加したい場合に非常に便利です。

insertPlainText() との違い

  • append() は常にドキュメントの末尾に新しい段落としてテキストを追加します。自動的に改行されます。
  • insertPlainText() は現在のカーソル位置にテキストを挿入し、カーソルを挿入されたテキストの末尾に移動させます。改行は明示的に指定する必要があります。

使用例

// ログメッセージを追記する
textEdit->append("新しいログメッセージが追加されました。");
textEdit->append("別のイベントが発生しました。");

void QTextEdit::insertHtml(const QString &html)

目的
HTML 形式のテキスト(リッチテキスト)を挿入したい場合。

説明
insertHtml() は、指定された HTML 文字列を現在のカーソル位置に挿入します。これにより、太字、斜体、色、フォントサイズ、画像、テーブルなど、さまざまな書式設定を持つテキストを QTextEdit に表示できます。insertPlainText() とは異なり、書式情報が維持されます。

insertPlainText() との違い

  • insertHtml() は HTML タグを含む文字列を解釈し、対応する書式を適用して表示します。
  • insertPlainText() は書式情報を持たない純粋なテキストを挿入します。

使用例

// 太字と赤色のテキストを挿入する
textEdit->insertHtml("これは <b>太字</b> のテキストです。<br>");
textEdit->insertHtml("<span style='color:red;'>これは赤色のテキストです。</span>");

void QTextEdit::setPlainText(const QString &text)

目的
QTextEdit 内の既存のテキストをすべて新しいプレーンテキストで置き換えたい場合。

説明
setPlainText() は、QTextEdit の現在の内容をすべてクリアし、指定された QString をプレーンテキストとして設定します。これは、既存のコンテンツを完全に新しいものにリフレッシュしたい場合によく使用されます。

insertPlainText() との違い

  • setPlainText() は既存のテキストをすべて「置換」します。
  • insertPlainText() は既存のテキストの途中に新しいテキストを「挿入」します。

使用例

// テキストエディタの内容を完全に新しいものにする
textEdit->setPlainText("これは完全に新しい内容です。\n以前のものはすべて消えました。");

同様に、void QTextEdit::setHtml(const QString &html) もあり、HTML 形式で内容をすべて置き換えることができます。

QTextCursor を直接操作する

目的
テキストの選択、置換、特定の書式設定の適用など、より詳細なテキスト操作を行いたい場合。

説明
QTextEdit のテキスト操作は、内部的に QTextDocumentQTextCursor を介して行われます。QTextCursor を直接取得し、そのメソッドを使ってテキストを挿入、削除、選択、書式設定などを行うことで、insertPlainText() よりもはるかに柔軟な制御が可能です。insertPlainText() は、実際には QTextCursor の内部的なラッパー関数のようなものです。

insertPlainText() との違い

  • QTextCursor を使用すると、カーソル位置の移動、テキストの選択、既存のテキストの削除、挿入するテキストへの書式適用など、はるかに複雑な操作が可能です。
  • insertPlainText() は現在のカーソル位置にプレーンテキストを挿入する単純な操作に特化しています。

QTextCursor でテキストを挿入する例

// QTextCursor を取得
QTextCursor cursor = textEdit->textCursor();

// カーソルを特定の位置に移動(例:2行目の先頭)
cursor.movePosition(QTextCursor::Start); // ドキュメントの先頭
cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, 1); // 1つ目のブロックの終わり
cursor.movePosition(QTextCursor::StartOfBlock); // そのブロックの先頭

// テキストを挿入
cursor.insertText("--- ここに新しいテキストを挿入 ---");

// 変更したカーソルを QTextEdit に設定し直す (通常は自動的に反映されるが、明示的に設定することも可能)
textEdit->setTextCursor(cursor);

QTextCursor でテキストを置換する例

// QTextCursor を取得
QTextCursor cursor = textEdit->textCursor();

// "既存の単語" を選択
if (cursor.find("既存の単語")) { // "既存の単語" を見つけたら
    cursor.insertText("新しい単語"); // 選択されたテキストを置き換える
    textEdit->setTextCursor(cursor); // カーソルを更新
}

QPlainTextEdit の利用

目的
リッチテキスト機能が不要で、純粋なプレーンテキストの表示・編集のみが必要な場合、特に大量のテキストを扱う場合。

説明
QPlainTextEditQTextEdit の軽量版であり、プレーンテキストの表示と編集に特化しています。内部的には QTextDocument のプレーンテキストモードを使用しており、リッチテキスト機能のオーバーヘッドがないため、QTextEdit よりもパフォーマンスが高く、特に非常に大きなテキストファイルやログファイルを扱う場合に適しています。insertPlainText()append() といった同様のメソッドを持っています。

QTextEdit との違い

  • QPlainTextEdit: 純粋なプレーンテキストのみを扱う。リッチテキストのオーバーヘッドがないため、より高速でメモリ効率が良い。
  • QTextEdit: リッチテキストとプレーンテキストの両方を扱える。多くの書式設定機能を持つ。
QPlainTextEdit *plainTextEdit = new QPlainTextEdit(this);
plainTextEdit->insertPlainText("これは QPlainTextEdit に挿入されたテキストです。\n");
plainTextEdit->append("別の行が追加されました。");