Qt QPlainTextEdit inputMethodEvent()とは?日本語解説とプログラミング

2025-03-21

QPlainTextEdit::inputMethodEvent() とは

QPlainTextEdit::inputMethodEvent() は、Qtのテキスト編集ウィジェットである QPlainTextEdit クラスにおいて、インプットメソッド(IME)の状態が変化した際に発生するイベントを処理するための仮想関数(virtual function)です。

具体的には、以下のような場合にこのイベントが発生します。

  • インプットメソッドの終了
    ユーザーがIMEをオフにしたとき。
  • 文字の確定
    IMEによって入力された文字が確定され、テキストエディットに挿入される直前。
  • 確定前の文字列の変更
    IMEが変換候補を絞り込んだり、入力中の文字列を修正したりしたとき。
  • 変換候補の表示
    IMEが入力中の文字列に対する変換候補を表示したとき。

役割と目的

このイベントハンドラを再実装(オーバーライド)することで、開発者は QPlainTextEdit におけるインプットメソッドの動作を細かく制御したり、IMEの状態に応じて特別な処理を行ったりすることができます。

例えば、以下のようなことが可能です。

  • IMEの状態に応じたUIの変更
    IMEのオン・オフや変換候補の表示状態に応じて、ウィジェットの表示を切り替える。
  • 入力中の文字列に対する独自の処理
    IMEが提供する情報に基づいて、入力中の文字列に対して何らかの処理を行う(例:スペルチェック、自動補完など)。
  • カーソル位置の調整
    IMEの動作に合わせてカーソル位置を適切に管理する。
  • IMEのプレースホルダーの描画
    IMEが入力中の文字列や変換候補を表示する領域(プレースホルダー)をカスタム描画する。

イベントオブジェクト QInputMethodEvent

inputMethodEvent() 関数が呼び出される際には、引数として QInputMethodEvent クラスのオブジェクトが渡されます。このオブジェクトには、発生したインプットメソッドイベントに関する様々な情報が含まれています。

主な情報としては以下のようなものがあります。

  • reason()
    イベントが発生した理由を示す列挙型 (QInputMethodEvent::Reason) の値(例:Commit, PreeditChanged, CursorPositionChanged など)。
  • caret()
    プレエディット文字列内でのキャレット(カーソル)の位置。
  • attributes()
    プレエディット文字列の各文字に付随する属性情報(例:下線、色など)。
  • preeditString()
    確定前の文字列(IMEによって入力中または変換中の文字列)。
  • commitString()
    確定された文字列(IMEによって入力が完了した文字)。

再実装の例 (C++)

QPlainTextEdit を継承したカスタムクラスで inputMethodEvent() を再実装する基本的な例を以下に示します。

#include <QPlainTextEdit>
#include <QInputMethodEvent>
#include <QDebug>

class MyPlainTextEdit : public QPlainTextEdit {
public:
    MyPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}

protected:
    void inputMethodEvent(QInputMethodEvent *event) override {
        qDebug() << "Input Method Event Occurred!";
        qDebug() << "Commit String: " << event->commitString();
        qDebug() << "Preedit String: " << event->preeditString();
        qDebug() << "Reason: " << event->reason();

        // デフォルトの処理を呼び出すことを忘れないでください
        QPlainTextEdit::inputMethodEvent(event);
    }

    void focusInEvent(QFocusEvent *event) override {
        QPlainTextEdit::focusInEvent(event);
        qDebug() << "Focus In";
        // フォーカスが当たったときにインプットメソッドを要求する(必要であれば)
        inputMethodQuery(Qt::ImEnabled);
    }

    QVariant inputMethodQuery(Qt::InputMethodQuery property) const override {
        if (property == Qt::ImEnabled) {
            return true; // インプットメソッドを有効にする
        }
        return QPlainTextEdit::inputMethodQuery(property);
    }
};

この例では、inputMethodEvent() が発生した際に、関連する情報をデバッグ出力しています。また、フォーカスが当たった際に inputMethodQuery(Qt::ImEnabled) を呼び出すことで、インプットメソッドが利用可能であることをシステムに通知しています。

  • インプットメソッドに関するより詳細な制御を行いたい場合は、QInputMethod クラスや QInputMethodQuery 列挙型についても理解を深めることが重要です。
  • IMEの動作はオペレーティングシステムやインプットメソッドの種類によって異なるため、プラットフォーム依存の挙動を考慮する必要がある場合があります。
  • inputMethodEvent() を再実装する際には、通常、基底クラスの QPlainTextEdit::inputMethodEvent(event) を呼び出す必要があります。これを忘れると、デフォルトのIME処理が行われなくなり、予期しない動作を引き起こす可能性があります。


よくあるエラーとトラブルシューティング

QPlainTextEdit::inputMethodEvent() を扱う際に遭遇しやすいエラーや問題点と、その解決策について解説します。

基底クラスの inputMethodEvent() を呼び忘れる

  • 解決策
    inputMethodEvent() を再実装する際には、必ず最後に(または適切なタイミングで) QPlainTextEdit::inputMethodEvent(event); を呼び出すようにしてください。
  • 原因
    基底クラスの inputMethodEvent() は、IMEの基本的な処理を担当しています。これを呼び出さないと、その処理がスキップされてしまいます。
  • 症状
    IMEのデフォルトの動作(文字の入力、変換候補の表示、確定など)が正しく行われなくなる。テキストが入力されなかったり、意図しない表示になったりする可能性があります。
  • エラー内容
    inputMethodEvent() を再実装した際に、QPlainTextEdit::inputMethodEvent(event); の呼び出しを忘れてしまう。

イベントオブジェクト (QInputMethodEvent) の誤った使用

  • 解決策
    • QInputMethodEvent のドキュメントをよく読み、各メソッドがどのような情報を提供し、どのような状況で利用すべきかを理解する。
    • reason() を確認し、イベントの種類に応じて適切な処理を行うようにする。例えば、QInputMethodEvent::Commit の場合にのみ確定された文字列を処理するなど。
    • プレエディット文字列の属性 (attributes()) を利用する場合は、その構造を理解し、適切に処理する。
  • 原因
    QInputMethodEvent が提供する各種メソッド(commitString(), preeditString(), attributes(), caret(), reason() など)の役割を理解していない、または取得した情報を前提と異なる方法で使用している。
  • 症状
    プレエディット文字列や確定文字列を誤って処理したり、属性情報を無視したりすることで、IMEの表示や入力が期待通りにならない。
  • エラー内容
    QInputMethodEvent オブジェクトから取得した情報を正しく解釈または使用できていない。

フォーカスの管理ミス

  • 解決策
    • focusInEvent()focusOutEvent() を再実装し、フォーカスの状態に応じて必要な処理(例えば、inputMethodQuery(Qt::ImEnabled) を呼び出してIMEを有効にするなど)を行う。
    • ウィジェットが本当にキー入力を受け付ける状態にあるかを確認する。isEnabled(), isVisible(), hasFocus() などのメソッドで状態を確認できます。
  • 原因
    IMEは通常、フォーカスのあるウィジェットに対して動作します。フォーカスの移動や管理が正しく行われていないと、IMEが期待通りに機能しません。
  • 症状
    IMEが有効にならない、または意図しないタイミングで無効になる。
  • エラー内容
    ウィジェットが適切にフォーカスを得ていない、またはフォーカスを失った際の処理が不適切である。

inputMethodQuery() の誤った実装

  • 解決策
    • IMEを有効にする場合は Qt::ImEnabled に対して true を返す。
    • プレースホルダーの矩形を問い合わせる Qt::ImCursorRectangleQt::ImPreferredInputMethod などのクエリに対して、適切な値を返すように実装する。
    • 基本的には、必要なクエリに対してのみ処理を行い、それ以外のクエリに対しては基底クラスの QPlainTextEdit::inputMethodQuery(property) を呼び出すようにする。
  • 原因
    inputMethodQuery() は、システムやIMEがウィジェットのIMEサポートに関する情報を問い合わせるために呼び出されます。この関数が誤った情報を返すと、IMEが適切に動作しません。
  • 症状
    IMEが有効にならない、プレースホルダーが表示されない、カーソル位置が正しくないなど、IMEの動作に異常が生じる。
  • エラー内容
    inputMethodQuery() を再実装した際に、IMEに関連するクエリに対して誤った値を返す。

プラットフォーム依存の問題

  • 解決策
    • 複数のプラットフォームや異なるIMEでテストを行い、問題が発生する環境を特定する。
    • プラットフォーム固有のAPIや挙動に関する情報を調査し、必要に応じてプラットフォームごとの処理を実装する。
    • Qtのバグトラッカーやフォーラムで同様の問題が報告されていないか確認する。
  • 原因
    IMEの動作はプラットフォームやIMEの種類によって大きく異なる場合があります。特定のIMEやOSの特性を考慮せずに実装すると、互換性の問題が発生することがあります。
  • 症状
    ある環境では正常に動作するが、別の環境ではIMEの挙動がおかしい。
  • エラー内容
    特定のオペレーティングシステムやインプットメソッドでのみ問題が発生する。

他のイベントとの干渉

  • 解決策
    • 各イベントハンドラの処理内容を注意深く確認し、データの競合や処理の順序の問題がないか分析する。
    • 必要に応じて、イベントの処理順序を制御したり、排他制御の仕組みを導入したりする。
    • IME関連の処理は、可能な限り inputMethodEvent() 内で行うようにし、他のイベントハンドラでの直接的なIME制御は避ける。
  • 原因
    複数のイベントハンドラで同じデータや状態を操作している場合に、処理の順序やタイミングによって問題が発生することがあります。
  • 症状
    文字が重複して入力される、入力が途中で止まる、意図しない副作用が発生するなど。
  • エラー内容
    inputMethodEvent() の処理が、他のイベント(例えば keyPressEvent(), textChanged() など)の処理と競合したり、順序が期待通りでなかったりする。
  • シンプルなテストケースの作成
    問題を特定するために、最小限のコードで再現できるテストケースを作成し、原因の切り分けを行う。
  • デバッグ出力の活用
    qDebug() などを使用して、inputMethodEvent() がいつ、どのような引数で呼び出されているか、また、関連する変数の状態などを出力し、処理の流れを確認する。


例1: IMEの状態をデバッグ出力する

この例では、QPlainTextEdit を継承したカスタムクラスを作成し、inputMethodEvent() を再実装して、IME関連の情報をデバッグ出力します。

#include <QPlainTextEdit>
#include <QInputMethodEvent>
#include <QDebug>

class MyPlainTextEdit : public QPlainTextEdit {
public:
    MyPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}

protected:
    void inputMethodEvent(QInputMethodEvent *event) override {
        qDebug() << "--- inputMethodEvent ---";
        qDebug() << "Reason: " << event->reason();
        qDebug() << "Commit String: \"" << event->commitString() << "\"";
        qDebug() << "Preedit String: \"" << event->preeditString() << "\"";
        qDebug() << "Caret Position: " << event->caret();
        qDebug() << "Attributes:";
        foreach (const QInputMethodEvent::Attribute &attr, event->attributes()) {
            qDebug() << "  Start: " << attr.start << ", Length: " << attr.length << ", Type: " << attr.type << ", Value: " << attr.value;
        }
        qDebug() << "------------------------";

        // デフォルトの処理を必ず呼び出す
        QPlainTextEdit::inputMethodEvent(event);
    }

    void focusInEvent(QFocusEvent *event) override {
        QPlainTextEdit::focusInEvent(event);
        // フォーカスを得たときにIMEを有効にする(必要に応じて)
        inputMethodQuery(Qt::ImEnabled);
    }

    QVariant inputMethodQuery(Qt::InputMethodQuery property) const override {
        if (property == Qt::ImEnabled) {
            return true;
        }
        return QPlainTextEdit::inputMethodQuery(property);
    }
};

説明

  • 重要な点
    QPlainTextEdit::inputMethodEvent(event); を呼び出すことで、デフォルトのIME処理が継続されるようにしています。
  • inputMethodQuery(Qt::InputMethodQuery property) const 関数を再実装し、Qt::ImEnabled のクエリに対して true を返すことで、このウィジェットでIMEを使用可能にしています。
  • focusInEvent(QFocusEvent *event) 関数も再実装し、ウィジェットがフォーカスを得たときに inputMethodQuery(Qt::ImEnabled) を呼び出してIMEを有効にしています。
  • inputMethodEvent(QInputMethodEvent *event) 関数を再実装し、イベントが発生した際に様々な情報を qDebug() で出力しています。
    • event->reason(): イベントが発生した理由(例: 文字の確定、プレエディット文字列の変更など)を示します。
    • event->commitString(): 確定された文字列を取得します。
    • event->preeditString(): 確定前の入力中の文字列(変換候補など)を取得します。
    • event->caret(): プレエディット文字列内でのカーソル位置を取得します。
    • event->attributes(): プレエディット文字列の各部分に適用される属性(例: 下線、色など)のリストを取得します。
  • MyPlainTextEdit クラスは QPlainTextEdit を継承しています。

使い方

この MyPlainTextEdit クラスのインスタンスをアプリケーションのUIに追加すると、IMEを使用して文字を入力するたびに、コンソールに詳細な情報が出力されます。これにより、IMEの状態変化をリアルタイムに把握することができます。

例2: プレエディット文字列に下線を引く

この例では、IMEが入力中のプレエディット文字列に下線を引いて表示するように inputMethodEvent() を再実装します。

#include <QPlainTextEdit>
#include <QInputMethodEvent>
#include <QTextCharFormat>
#include <QPainter>

class UnderlinePlainTextEdit : public QPlainTextEdit {
public:
    UnderlinePlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}

protected:
    void inputMethodEvent(QInputMethodEvent *event) override {
        // プレエディット文字列がある場合、下線属性を設定
        if (!event->preeditString().isEmpty()) {
            QList<QInputMethodEvent::Attribute> attributes;
            QTextCharFormat format;
            format.setUnderline(true);
            attributes.append({0, event->preeditString().length(), QInputMethodEvent::TextFormat, format});
            event->setAttributes(attributes);
        }
        QPlainTextEdit::inputMethodEvent(event);
    }

    void paintEvent(QPaintEvent *event) override {
        QPlainTextEdit::paintEvent(event);

        QInputMethodEvent *imEvent = inputMethodQuery(Qt::ImInputMethod)
                                       .value<QInputMethodEvent *>();
        if (imEvent && !imEvent->preeditString().isEmpty()) {
            QRect caretRect = cursorRect();
            QString preeditString = imEvent->preeditString();
            QList<QInputMethodEvent::Attribute> attributes = imEvent->attributes();
            QPainter painter(viewport());
            QFontMetrics fm = fontMetrics();

            int x = caretRect.x() - fm.horizontalAdvance(textCursor().selectedText()); // プレエディット開始位置を推定

            for (const auto &attr : attributes) {
                if (attr.type == QInputMethodEvent::TextFormat) {
                    painter.setFont(font()); // 基本フォントを適用
                    QTextCharFormat format = attr.value.value<QTextCharFormat>();
                    painter.setFont(format.font().isValid() ? format.font() : font());
                    if (format.underline()) {
                        int startX = x + fm.horizontalAdvance(preeditString.left(attr.start));
                        int endX = startX + fm.horizontalAdvance(preeditString.mid(attr.start, attr.length));
                        int y = caretRect.bottom() + 1; // 下線のy座標
                        painter.drawLine(startX, y, endX, y);
                    }
                }
            }
        }
    }

    void focusInEvent(QFocusEvent *event) override {
        QPlainTextEdit::focusInEvent(event);
        inputMethodQuery(Qt::ImEnabled);
    }

    QVariant inputMethodQuery(Qt::InputMethodQuery property) const override {
        if (property == Qt::ImEnabled || property == Qt::ImInputMethod) {
            if (property == Qt::ImInputMethod && !preeditString_.isEmpty()) {
                QInputMethodEvent *event = new QInputMethodEvent();
                event->setPreeditString(preeditString_, preeditAttributes_, inputMethodCaretPosition());
                return QVariant::fromValue(event);
            }
            return true;
        }
        return QPlainTextEdit::inputMethodQuery(property);
    }

    void insertPlainText(const QString &text) override {
        QPlainTextEdit::insertPlainText(text);
        preeditString_.clear();
        preeditAttributes_.clear();
    }

protected:
    QString preeditString_;
    QList<QInputMethodEvent::Attribute> preeditAttributes_;
};

説明

  • 注意点
    この例は、プレエディット文字列の描画をアプリケーション側で行う必要がある場合の基本的なアプローチを示しています。実際のIMEの動作やプラットフォームによっては、より複雑な処理が必要になる場合があります。
  • insertPlainText() をオーバーライドして、テキストが確定されたときにプレエディット関連の情報をクリアしています。
  • inputMethodQuery()Qt::ImInputMethod のクエリに対して、現在のプレエディット文字列と属性を含む QInputMethodEvent を返すようにしています。これにより、Qtの内部処理がプレエディットの状態を認識できます。
  • paintEvent() を再実装し、プレエディット文字列とその属性に基づいて下線を描画しています。これは、IMEが直接下線を描画しない場合に、アプリケーション側で描画を行う必要があるためです。
  • inputMethodEvent() では、プレエディット文字列が存在する場合、その全体に下線属性を設定した QInputMethodEvent::Attribute を作成し、event->setAttributes() でイベントに設定しています。

使い方

この UnderlinePlainTextEdit クラスのインスタンスを使用すると、IMEで文字を入力中に表示されるプレエディット文字列に下線が表示されます。

例3: 特定の文字入力を禁止する

この例では、特定の文字(例えば "@")の入力をIMEからも禁止する方法を示します。

#include <QPlainTextEdit>
#include <QInputMethodEvent>
#include <QKeyEvent>

class NoAtPlainTextEdit : public QPlainTextEdit {
public:
    NoAtPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}

protected:
    void inputMethodEvent(QInputMethodEvent *event) override {
        QString commitText = event->commitString();
        if (commitText.contains('@')) {
            // "@" が含まれている場合は確定文字列をクリアする
            QInputMethodEvent dummyEvent;
            QPlainTextEdit::inputMethodEvent(&dummyEvent); // 実質的に入力を無視
        } else {
            QPlainTextEdit::inputMethodEvent(event);
        }
    }

    void keyPressEvent(QKeyEvent *event) override {
        if (event->text() == "@") {
            event->ignore(); // キー入力からも "@" を禁止
            return;
        }
        QPlainTextEdit::keyPressEvent(event);
    }
};

説明

  • keyPressEvent() も再実装し、直接キー入力された "@" を event->ignore() で無視しています。これにより、IME経由だけでなく、直接キーボードから "@" が入力されることも防ぎます。
  • もし "@" が含まれていれば、新しい空の QInputMethodEvent を作成して基底クラスの inputMethodEvent() に渡すことで、実質的にその入力を無視します。
  • inputMethodEvent() では、IMEから確定された文字列 (event->commitString()) に "@" が含まれているかどうかを確認します。

使い方

この NoAtPlainTextEdit クラスのインスタンスでは、IMEやキーボードから "@" を入力しようとしても、テキストエディットには入力されません。

  • inputMethodQuery() の役割
    ウィジェットがIMEをサポートするかどうか、プレースホルダーの矩形、入力メソッドのロケールなど、IMEに関する様々な情報をシステムに提供するために inputMethodQuery() を適切に実装することが重要です。
  • イベントオブジェクトの活用
    QInputMethodEvent オブジェクトには、IMEの状態に関する様々な情報が含まれています。これらの情報を適切に利用することで、高度なIME連携処理を実装できます。
  • 基底クラスの呼び出し
    ほとんどの場合、inputMethodEvent() を再実装する際には、基底クラスの QPlainTextEdit::inputMethodEvent(event); を呼び出す必要があります。これを忘れると、IMEの基本的な機能が失われる可能性があります。


QInputMethod クラスの利用

QInputMethod クラスは、システム全体の入力メソッドにアクセスし、その状態を問い合わせたり、制御したりするためのAPIを提供します。inputMethodEvent() が特定の QPlainTextEdit インスタンスに紐付いているのに対し、QInputMethod はよりグローバルな視点からIMEを扱います。

  • プレースホルダーの矩形の設定
    QInputMethod::setCursorRectangle() で、IMEのプレースホルダーが表示されるべき矩形を指定できます。
  • 入力コンテキストの取得
    QInputMethod::inputContext() で現在の入力コンテキストを取得し、その状態を調べたり、イベントを送信したりできます。
  • IMEの有効/無効の切り替え
    QInputMethod::show()QInputMethod::hide() を使用して、IMEの表示/非表示を制御できます。


フォーカスを得たときにIMEを表示する

#include <QPlainTextEdit>
#include <QFocusEvent>
#include <QGuiApplication>
#include <QInputMethod>

class MyPlainTextEdit : public QPlainTextEdit {
public:
    MyPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}

protected:
    void focusInEvent(QFocusEvent *event) override {
        QPlainTextEdit::focusInEvent(event);
        QGuiApplication::inputMethod()->show();
    }

    void focusOutEvent(QFocusEvent *event) override {
        QPlainTextEdit::focusOutEvent(event);
        QGuiApplication::inputMethod()->hide();
    }
};

この例では、focusInEvent()QGuiApplication::inputMethod()->show() を呼び出し、フォーカスが当たるとIMEを表示させています。inputMethodEvent() を直接扱っていません。

QInputMethodQuery 列挙型と inputMethodQuery() 関数の利用

QPlainTextEdit (および QWidget を継承する他のクラス) は、仮想関数 inputMethodQuery(Qt::InputMethodQuery property) const を持っています。この関数を再実装することで、IMEが必要とする様々な情報(IMEが有効かどうか、カーソルの矩形、利用可能なロケールなど)を提供できます。

inputMethodEvent() ほど低レベルではありませんが、IMEの基本的な動作を制御する上で非常に重要です。例えば、IMEを有効にするかどうかは、inputMethodQuery(Qt::ImEnabled) の戻り値によって決まります。


IMEを常に有効にする

#include <QPlainTextEdit>

class MyPlainTextEdit : public QPlainTextEdit {
public:
    MyPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}

protected:
    QVariant inputMethodQuery(Qt::InputMethodQuery property) const override {
        if (property == Qt::ImEnabled) {
            return true;
        }
        return QPlainTextEdit::inputMethodQuery(property);
    }
};

この例では、inputMethodQuery() を再実装し、Qt::ImEnabled に対して常に true を返すことで、この QPlainTextEdit では常にIMEが有効になるようにしています。

高レベルなテキスト編集機能の利用

Qtのテキスト編集ウィジェット (QLineEdit, QTextEdit, QPlainTextEdit) は、多くの一般的なテキスト編集機能をデフォルトでサポートしています。IMEとの連携もその一つであり、通常は特別なコーディングなしに、OSのIMEが透過的に利用できます。

単純なテキスト入力や表示が目的であれば、inputMethodEvent() を直接扱う必要はなく、これらのウィジェットの標準機能を利用するだけで十分な場合があります。

イベントフィルタの利用

QObject::installEventFilter() を使用して、特定のオブジェクトやアプリケーション全体のイベントを監視し、必要に応じて横取りしたり、処理したりすることができます。

IME関連のイベント(例えば、QEvent::InputMethodQuery, QEvent::InputMethod) をフィルタリングすることで、inputMethodEvent() を再実装せずに、IMEの動作に介入することが可能です。ただし、これはやや高度なテクニックであり、慎重な実装が求められます。


アプリケーション全体で IME の Query イベントを監視する (概念的な例)

#include <QApplication>
#include <QEvent>
#include <QDebug>

class InputMethodFilter : public QObject {
protected:
    bool eventFilter(QObject *watched, QEvent *event) override {
        if (event->type() == QEvent::InputMethodQuery) {
            qDebug() << "InputMethodQuery event for object:" << watched;
            // 必要に応じてイベントを処理または変更
        }
        return QObject::eventFilter(watched, event);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    InputMethodFilter filter;
    app.installEventFilter(&filter);

    // ... ウィンドウやテキストエディットの作成 ...

    return app.exec();
}

この例は概念的なもので、実際のIMEの動作を完全に制御するには、より詳細な処理が必要です。

inputMethodEvent() を選択するべき場合

inputMethodEvent() は、以下のような高度なIME連携が必要な場合に特に有効です。

  • 低レベルなIMEイベントの監視と介入
    IMEの内部的な動作に深く関与する必要がある場合。
  • IMEの状態に応じたUIの細かな制御
    IMEのオン/オフや変換状態に合わせて、UIの表示を動的に変更したい場合。
  • 入力中の文字列に対する特別な処理
    変換中の文字列に対して、リアルタイムに何らかの処理(例:スペルチェック、構文解析)を行いたい場合。
  • カスタムのプレースホルダー描画
    IMEの候補表示領域を独自に描画したい場合。

QPlainTextEdit::inputMethodEvent() は強力なツールですが、Qtはより高レベルなAPIや標準機能を通じて、IME連携の基本的なニーズに対応しています。

  • アプリケーション全体のイベント監視
    イベントフィルタの利用(高度なケース)。
  • 標準的なテキスト入力機能
    デフォルトのテキスト編集ウィジェットの利用。
  • IMEの基本的なサポートに関する情報の提供
    inputMethodQuery() 関数の再実装。
  • 簡単なIMEの有効/無効の制御やグローバルなIME操作
    QInputMethod クラスの利用。