戻る

qshdlgの勉強部屋

qshdlg その1
qshdlg その2
qshdlg その3
qshdlg その4

qshdlgはCUIとGUIの間を繋ぐ為の汎用ダイアログです。
シェルスクリプトに組み込んで対話的に処理を行う事が出来るようになります。
入手先はこちら

サンプルプログラム(eucJPで書いてあります)
サンプル1
サンプル2
サンプル3
サンプル4

その1


まずは/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な入出力系が簡単に作成可能となります。

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


その2


簡易ランチャーのようなものを作ってみました。 ザウルスのGUIなアプリケーションプログラムの本体は/home/QtPalmtop/bin/以下に存在します、ここのファイルリストをメニューに表示、選択させて起動させるという至って簡単なものです。

その1では

echo 'item(QString,QString)' ラベル 値 > $CONTROL
を使ってメニュー項目を作成しましたが、今回は
echo 'item(QString)' ラベル > $CONTROL
を使用します、QStringが1個少ないので引数も「ラベル」しかありません、このメニューが選択された場合に返される値は「ラベル」そのものとなります。
for文の中で、/home/QtPalmtop/bin/以下に存在するファイル名を1個づつ取り出し、それをラベルとしてメニュー作成します。
なお、
echo 'label(QString)' '"ファイルリスト"' > $CONTROL
はセレクトビューに他のメニュー項目と一緒に表示されますが、選択はできない項目となります。メニューのタイトルや区切りのような使い方をさせる感じですか。
メニューからファイル名が選択されると、そのファイル名が返されるのでwhile文の中で
qcop QPE/System 'execute(QString,QString)' $RET
としてqcopコマンドでアプリケーションを起動させています。
画面上半分のメッセージビューを消して全面セレクトビューとして表示させたい場合は、qshdlgを起動させている行を
qshdlg select -A -t "sample2" -c eucJP -M &
とすればOK。

注意:
表示されるファイルにはQTアプリケーションではないファイルもあるので選択実行は、「addressbook」「calculater」「datebook」など何をするアプリかがわかるもので実験すること。


その3


簡単な電卓を作成しました。といっても整数の加減算しかできないへタレ電卓ですが(汗
乗除算も試したのですが上手くいきませんでした、ターミナル上の計算では上手くいくのですが、何故だろう? 起動すると画面下に「1」〜「0」、「+」「-」「=」「Exit」ボタンが出来るので計算ができます、終了は「Exit」ボタン

qshdlg reply -v "1,2,3,4,5,6,7,8,9,0,+,-,=,Exit" -A -f lcfont -t "sample3" -c eucJP -M &
今回はボタンで入力を行うので、qshdlgはreplyモード?で起動します。オプションの-v で表示させるボタンのラベルと値を指定しています。もしラベルと値が異なる場合は-l オプションでラベル名を指定します。

標準で表示される「OK」「Cancel」ボタンは今回は必要ないので

echo 'hideDefault()' > $CONTROL
で表示させなくしています、これはqshdlg起動時に-n オプションを指定することでも可能です。

押されたボタンの値は$INPUTから返されるので、もし数字ボタンと「+」「-」の場合は$STRに数式として追加させて、「=」の場合はexpr コマンドでその数式を評価して値を計算させます。
「Exit」ボタンが押された場合は

echo 'reject()' > $CONTROL
を実行、「Cansel」ボタンを押した場合と同じ動作をするので、これでプログラムを終了させています。

その4


今日はアイコン登録するのではなくターミナル上から、あるいはKeyHelper等から呼び出すタイプの実験をしてみました。と言っても殆ど同じですけど。

実行するとメッセージダイアログが表示して「メッセージを表示します」と出力されます。-h と-w はダイアログサイズの指定です

while read RET < $INPUT
do
done
で入力待ちにすることで、「OK」か「Cancel」が押されるまでスクリプトの続きを実行するのを停止させています。while文がないとメッセージダイアログが表示していてもスクリプトは先を実行します。while文の有無でターミナルに“Message Dialog Close”が表示されるタイミングに注意。
メッセージダイアログを指定時間だけ表示させたい場合は、-q オプションで秒数を指定します。


次は値の入力
インプットダイアログを表示して入力された文字を$RETに代入しています、日本語も入力できました。インプットダイアログは上にメッセージビューがくっついてくるのでサイズ調整して見えないようにしています。入力された文字はメッセージビューにエコーバック表示されるみたいなのでこれが嫌な場合は -N オプション、パスワード入力のように入力欄の文字も隠したい場合は -P オプションをつけること。
なお、「Cancel」が押された場合は空文字が返されるみたいですね。「OK」や「Enter」で文字を入力した場合はダイアログが閉じないので

echo 'reject()' > $CONTROL
で閉じるようにしています。
最終更新日 2005-08-24