IMEからキー入力の受け取り

日本語入力システムなどのIMEからのキー入力を受け取りたい場合、QWidgetkeyPressEventをオーバーライドしても受け取ることはできません。

keyPressEventで受け取ることができるのは半角1文字のみです。

では、どうやってIMEで変換または変換途中の文字列を受け取るかというとinputMethodEventQWidgetクラスでオーバーライドします。

inputMethodEventに渡されるQInputMethodEventでは次の2つの関数でIMEにより変換された文字列を取得可能です。

  1. preeditString
  2. IMEで文字列が入力途中の場合にその文字列を返す。

  3. commitString
  4. IMEで入力途中だった文字列がエンターキーで確定された場合、その文字列を返す。

この2つのメソッドで変換途中と変換後の文字列を調べられます。

実装例

簡単な例としてQPlainTextEditでIMEの入力を受け取り、エディター上に表示する場合を考えてみます。

#ifndef MY_EDIT
#define MY_EDIT

#include <QPlainTextEdit>

class MyEdit : public QPlainTextEdit
{
public:
    explicit MyEdit(QWidget * parent = 0)
    : QWidget(parent){}
    
protected:
    void inputMethodEvent(QInputMethodEvent * e)
    {
        QWidget::inputMethodEvent(e);
        
        if(!e->commitString().isEmpty()){
            insertPlainText(e.commitString());
                ///変換後のテキスト挿入
        }
    }
};

#endif ///MY_EDIT

commitStringが空でない、つまり入力途中でないことを確かめたらエディターに変換後のテキストを挿入しています。

以上、QWidgetでIMEの入力を受け取る方法でした。では、また!

関連項目
プライバシーポリシー