Qt5でbuildされた QtCreatorで日本語入力をできるようにする(@Linux環境)
はじめに
Qt 5.1 Beta Released | Qt Blogの発表もあり、今回からバイナリが手に入るのとの事で
週末の名古屋もくもく会場(になってしまっている場所)で早速installしてみたのですが
付属のQtCreatorで日本語入力できなかった!
動作確認 環境
- Install PC
- QtCreator ver.2.7.1
- qt-linux-opensource-5.1.0-beta1-x86_64-offline.runに含まれるToolsのQtCreator
- qt-projectで単体配布しているQt Creator 2.7.1 for Linux/X11 64-bit
- gitのqt-creator tag v2.7.1
buildは、qt-linux-opensource-5.1.0-beta1-x86_64-offline.runのlibraryにて行なってみた。
動作結果
QtCreator | QtLibrary Version |
デフォルトでの 日本語入力 |
対応方法 |
---|---|---|---|
qt-linux-opensource-5.1.0-beta1-x86_64-offline.runのQtCreator | Qt 5.1.0(64bit) | できない | 環境変数の変更 pluginの追加または、plugin pathの変更 |
qt-projectの単体配布 | Qt4.8.4(64bit) | できる | - |
gitのqt-creator tag v2.7.1 | Qt 5.1.0(64bit) | できない | 環境変数の追加 |
Qt4では各プラットフォームにてInputMethodが実装されていたようなのですが
Qt5では、QInputContextクラスが整備され、QPlatformInputContextのクラスを新設する事によって、
プラットフォーム毎のInputMethodを統合したようです。
この為、今回のようにQt4とQt5でbuidしたものによって、挙動が変わってしまったと思われます。
(Qt4.8系は、組み込み用で使用しているQWSあたりしか、ざっと見たことが無いので良く分からんとです。)
詳細な情報は、Qt5 の Input Method | Qt のあれこれ (仮)に分かりやすく まとめられています。
対応方法(Qt5を使用する場合)
- 環境変数の変更
- pluginの追加または、plugin pathの変更
となります。
環境変数の変更
exportにて、環境変数の確認を行い、
$ export | grep IM declare -x GTK_IM_MODULE="ibus" declare -x LC_TIME="ja_JP.UTF-8" declare -x QT_IM_MODULE="xim"
QT_IM_MODULE="xim"
となっている場合、コンソール上にて
export QT_IM_MODULE=ibus
とした後、そのコンソールにてqtcreatorを呼び出します。
ざっくりと、該当Codeを眺めて見たのですが
- 環境変数QT_IM_MODULEにセットされたStringをicStringにセット(83行)
- 環境変数に入っている文字にて、create()にてpluginをload。(88行)
- loadの戻値が設定されており、入力方式が有効な場合はreturn(89行)
といった感じでしょうか。
${Qt5.1.0}/qtbase/blobs/v5.1.0-beta1/src/gui/kernel/qplatforminputcontextfactory.cpp
79: QPlatformInputContext *QPlatformInputContextFactory::create() 80: { 81: QPlatformInputContext *ic = 0; 82: 83: QString icString = QString::fromLatin1(qgetenv("QT_IM_MODULE")); 84: 85: if (icString == QLatin1String("none")) 86: icString = QStringLiteral("compose"); 87: 88: ic = create(icString); 89: if (ic && ic->isValid()) 90: return ic; 91: 92: delete ic; 93: ic = 0; 94: 95: QStringList k = keys(); 96: for (int i = 0; i < k.size(); ++i) { 97: if (k.at(i) == icString) 98: continue; 99: ic = create(k.at(i)); 100: if (ic && ic->isValid()) 101: return ic; 102: delete ic; 103: ic = 0; 104: } 105: 106: return 0; 107: }
また、Qt5.1.0beta1で対応(?)されているInputMethodは、
${Qt5.1.0}/qtbase/src/plugins/platforminputcontexts より
- compose これ何??(誰か教えてくださいw) ..... libcomposeplatforminputcontextplugin
- Maliit(マリート ..... libmaliitplatforminputcontextplugin
- ibus ..... libibusplatforminputcontextplugin
の3種類のようです。
pluginの追加または、plugin pathの変更
上記だけの対応だけで、OKかと思ったのですが
qt-linux-opensource-5.1.0-beta1-x86_64-offline.runに含まれるToolsのQtCreatorが、まだ日本語入力できない。
でも、gitでcloneしてbuildしたものは問題なく日本語入力できるといった所で詰んでいたのですが
同もくもく会場で、何かと戦っている猫帽子王から
LinuxでQtアプリを配布するときにインプットメソッド関連っぽい名前のプラグインを同梱しないと日本語入力できないってことを少し前調べててわかったよ?
— 理音伊織さん (@IoriAYANE) 2013年5月18日
お告げ来ました!。
diffってみる
$ LANG=c diff -rq ${QT510BETA1}/5.1.0-beta1/gcc_64/plugins/ ${QT510BETA1}/Tools/QtCreator/bin/plugins/ | grep "Only" Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: audio Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: bearer Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: generic Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: mediaservice Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: platforminputcontexts Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: platformthemes Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: playlistformats Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: qmltooling Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: sensorgestures Only in /opt/DeveloperTool/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/plugins/: sensors
ToolsのQtCreatorが参照しているplugin Directoryにplatforminputcontexts丸々入ってない...。(なんでやねん)
対応1:
Qt5.1.0のpluginから./platforminputcontextsをQtCreatorのpluginへCopyする。
一番手っ取り早い手ですね。
$ cd ${QT510BETA1}/Tools/QtCreator/bin/plugins $ cp -arpv ../../../../5.1.0-beta1/gcc_64/plugins/platforminputcontexts/ . `../../../../5.1.0-beta1/gcc_64/plugins/platforminputcontexts/' -> `./platforminputcontexts' `../../../../5.1.0-beta1/gcc_64/plugins/platforminputcontexts/libmaliitplatforminputcontextplugin.so' -> `./platforminputcontexts/libmaliitplatforminputcontextplugin.so' `../../../../5.1.0-beta1/gcc_64/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so' -> `./platforminputcontexts/libibusplatforminputcontextplugin.so' `../../../../5.1.0-beta1/gcc_64/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so' -> `./platforminputcontexts/libcomposeplatforminputcontextplugin.so'
対応2:
${QT510BETA1}/Tools/QtCreator/bin/の中にある、qt.confを書き変える。
Pluginsのpathを下記のように書きかえる事により参照先をQt5.1.0のlibraryのplugin先に変える。
ただしplugin自体のディレクトリ以下で、同名のファイルにおいてbinaryLvで差が出ていたので
あまりヨロシクない方法だと思います。
--- qt.conf.org 2013-05-18 13:48:13.783456942 +0900 +++ qt.conf 2013-05-21 23:35:27.646429207 +0900 @@ -1,5 +1,5 @@ [Paths] Libraries=../lib/qtcreator -Plugins=plugins +Plugins=../../../5.1.0-beta1/gcc_64/plugins Imports=imports Qml2Imports=qml
対応3:
installしたディレクトリを弄りたくない人向け(僕これw)
$ cat > ./qtcreator271_Qt510 <<EOF #!/bin/bash export QT_IM_MODULE=ibus export QT_PLUGIN_PATH=${QT510BETA1}/5.1.0-beta1/gcc_64/plugins ${QT510BETA1}/Tools/QtCreator/bin/qtcreator EOF $ chmod 755 ./qtcreator271_Qt510 $ sudo mv ./qtcreator271_Qt510 /usr/local/bin
FULL pathで記載してください。${QT510BETA1}は、インストール時のpathになります。
各インストール環境によって読み替えてください。
デフォルトのinstall pathだと、
"/home/$USER/Qt5.1.0"
となっていると思います。
実行するときは、コンソール上にて
$ qtcreator271_Qt510 &
GUI環境のマウスクリックじゃないと耐えられないかたは、デスクトップショートカットを作成する。
$ cat > ./QtCreator2.7.1.desktop <<EOF [Desktop Entry] Name=Qt Creator2.7.1 Name[ja]=Qt Creator2.7.1 Categories=Development;IDE;Qt; Encoding=UTF-8 Exec=/bin/sh -c "export QT_IM_MODULE=ibus; export QT_PLUGIN_PATH=${QT510BETA1}/5.1.0-beta1/gcc_64/plugins; ${QT510BETA1}/Tools/QtCreator/bin/qtcreator" Path=${QT510BETA1}/Tools/QtCreator GenericName=The IDE of choice for Qt development. Hidden=true Icon=QtProject-qtcreator MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.nokia.qt.qmakeprofile;application/vnd.nokia.xml.qt.resource; Terminal=false Type=Application EOF $ chmod 755 ./QtCreator2.7.1.desktop
shにて
export QT_IM_MODULE=ibus;
export QT_PLUGIN_PATH=${QT510BETA1}/5.1.0-beta1/gcc_64/plugins;
${QT510BETA1}/Tools/QtCreator/bin/qtcreator"
をコマンド実行させるデスクトップショートカットです。
生成したファイルをダブルクリックで実行してUbuntuの場合なら、Launcherの
QtCreatorアイコン箇所を右クリック->Launcherに登録
POINT
export QT_IM_MODULE=ibus;は必須。
環境変数QT_PLUGIN_PATHを入れることにより、Pluginsディレクトリの設定ができます。