hakeの日記

Windows環境でプログラミングの勉強をしています。

qshdlg - シェルスクリプトと対話的に処理を行う

現在シェルスクリプトの勉強をしながらザウルスを弄っているわけですけれども、GUIな環境とのやりとりが簡単にできればもっと面白いことができるんじゃないかなと思い、yaktyさんのqshdlgに挑戦してみました。

LinuZau ToolBox -qshdlg-
http://tbox.jpn.org/wiki/linuzau/wiki.cgi?qshdlg


まずは/home/QtPalmtop/bin/qshdlg_smplというスクリプトファイルを作成して、chmod a+xで実行属性をつけます。日本語はeucコードで書くこと。

#!/bin/sh

export QSHDLG_APP=qshdlg_smpl

INPUT=/var/spool/qshdlg/input_$QSHDLG_APP
OUTPUT=/var/spool/qshdlg/output_$QSHDLG_APP
CONTROL=/var/spool/qshdlg/control_$QSHDLG_APP

qshdlg message -A -t "sample1" -M -c eucJP &

while [ ! -p $CONTROL ]
do
done

echo "メッセージを表示します" > $OUTPUT

次にザウルスホーム画面の「設定」タブの「ホーム画面設定」でアイコン登録をします、名前は適当に(例として「qshdlg_smpl」)、アイコンは適当なもの、ソフトウェアに上記スクリプト名「qshdlg_smpl」を指定。起動させてみて横倒しに表示された場合は/home/QtPalmtop/apps/Applicasions/UserApp?.desktopファイル(アプリケーションタブにアイコンを置いた場合、?は数字)をエディタで開いて

Type=Application
Display=640x480/144dpi,480x640/144dpi

を追加して、再度「ホーム画面設定」を開いて、なにもしないで「OK」を押したら上手くいきました、原因は不明。



アイコンをクリックして起動させると下部に「OK」「Cancel」ボタンのあるメッセージビューというウィンドウが開いて、中に「メッセージを表示します」という文字が表示される。「OK」あるいは「Cancel」ボタンを押すと終了する。
ここで

export QSHDLG_APP=qshdlg_smpl

でアプリケーション名を設定、ファイル名と同じ名前にする。

qshdlg message -A -t "sample1" -M -c eucJP &

でqshdlgを起動させている。-t はタイトルバーに表示させる文字を指定するオプション、-c は日本語の文字コードを指定するオプション。
$INPUT、$OUTPUT、$CONTROLは情報のやり取りを行うパイプを定義、while文でパイプが作成されるまでウェイトさせている。このあたりはyaktyさんのところのサンプルをそのまま利用しています。

echo "メッセージを表示します" > $OUTPUT

最後にecho文の出力を$OUTPUTにリダイレクトさせる。こうすることで任意の文字をメッセージビューに表示させることができます。




これだけではメッセージを表示してボタンを押すと終了してしまうので、qshdlgを起動させている行を以下のように「message」の部分を「custom -C messsage」と書き換える。

qshdlg custom -C message -A -t "sample1" -M -c eucJP &

こうすることで、「OK」ボタンを押しても終了しなくなります。




次に入力系の記述。スクリプトqshdlg_smplの最後に以下を追加します。

echo 'item(QString,QString)' '"メニュー1"' 1 > $CONTROL
echo 'item(QString,QString)' '"メニュー2"' 2 > $CONTROL
echo 'item(QString,QString)' '"メニュー3"' 3 > $CONTROL
echo 'showSelect()' > $CONTROL

アイコンをクリックすると画面の下半分がセレクトビューとなり

メニュー1
メニュー2
メニュー3

が表示される、これは上下カーソルキーと「OK」で選択可能なメニュー項目となります。
item(QString,QString)はメニューのラベルと値を設定している、例えば1行目の場合ラベル「メニュー1」を表示して、もし選択された場合は値「1」を返す。最後にshowSelect()の行をつけるのがポイント、これでセレクトビューが作成されてメニュー項目が表示されます。




更に返された値の処理系を記述。スクリプトqshdlg_smplの最後に以下を追加

while read RET < $INPUT
do
  case $RET in
       1)
           echo "$RET:メニュー1が選択されました" > $OUTPUT
           ;;
       2)
           echo "$RET:メニュー2が選択されました" > $OUTPUT
           ;;
       3)
           echo "$RET:メニュー3が選択されました" > $OUTPUT
           ;;
   esac
done

セレクトビューで選択されたメニューの値は$INPUTから返されるので、その値を$RETで受けてcase文で場合わけしている。ここでは返された値(1〜3)に応じた文字をメッセージビューに表示させている。つまり、「メニュー1」を選択すれば「メニュー1が選択されました」と表示されることになります。




ここでshowSelect()の行を

echo 'showReply()' > $CONTROL

と書き換えてみます。こうするとセレクトビューの代わりに「メニュー1」「メニュー2」「メニュー3」のボタンが追加されて、メニューの代わりにボタンで選択が可能になります。




この様にqshdlgを使うと単純なシェルスクリプトGUIな入出力系が簡単に作成可能となります。自分のようなまともなソフトウェアを作成するスキルや根性が無い人間にとってqshdlgは非常にありがたい存在ですね(汗


注意事項:

  • オプションの-cで日本語コードが選べるけれどもeucJP以外で文字化けしてしまった、eucJPを使用するのが無難?
  • $CONTROLに文字列をリダイレクトする場合は、ダブルクォートとシングルクォートで二重に囲わないと上手く表示しない場合がある。