emblog Qtのあれ

Qt関連のあれだったり、これだったり by sazus

Qt5でbuildされた QtCreatorで日本語入力をできるようにする(@Linux環境)

はじめに

Qt 5.1 Beta Released | Qt Blogの発表もあり、今回からバイナリが手に入るのとの事で
週末の名古屋もくもく会場(になってしまっている場所)で早速installしてみたのですが
付属のQtCreatorで日本語入力できなかった!

動作確認 環境


動作結果

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したものは問題なく日本語入力できるといった所で詰んでいたのですが
同もくもく会場で、何かと戦っている猫帽子王から


お告げ来ました!。
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ディレクトリの設定ができます。