まずは/home/QtPalmtop/bin/qshdlg_smplというスクリプトファイルを作成して、chmod a+xで実行属性をつけます。日本語はeucコードで書くこと。
次にザウルスホーム画面の「設定」タブの「ホーム画面設定」でアイコン登録をします、名前は適当に(例として「qshdlg_smpl」)、アイコンは適当なもの、ソフトウェアに上記スクリプト名「qshdlg_smpl」を指定。起動させてみて横倒しに表示された場合は/home/QtPalmtop/apps/Applicasions/UserApp?.desktopファイル(アプリケーションタブにアイコンを置いた場合、?は数字)をエディタで開いて#!/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
を追加して、再度「ホーム画面設定」を開いて、なにもしないで「OK」を押したら上手くいきました、原因は不明。Type=Application Display=640x480/144dpi,480x640/144dpi
アイコンをクリックして起動させると下部に「OK」「Cancel」ボタンのあるメッセージビューというウィンドウが開いて、中に「メッセージを表示します」という文字が表示される。「OK」あるいは「Cancel」ボタンを押すと終了する。
ここで
でアプリケーション名を設定、ファイル名と同じ名前にする。export QSHDLG_APP=qshdlg_smpl
でqshdlgを起動させている。-t はタイトルバーに表示させる文字を指定するオプション、-c は日本語の文字コードを指定するオプション。qshdlg message -A -t "sample1" -M -c eucJP &
最後にecho文の出力を$OUTPUTにリダイレクトさせる。こうすることで任意の文字をメッセージビューに表示させることができます。echo "メッセージを表示します" > $OUTPUT
これだけではメッセージを表示してボタンを押すと終了してしまうので、qshdlgを起動させている行を以下のように「message」の部分を「custom -C messsage」と書き換える。
こうすることで、「OK」ボタンを押しても終了しなくなります。qshdlg custom -C message -A -t "sample1" -M -c eucJP &
次に入力系の記述。スクリプト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
が表示される、これは上下カーソルキーと「OK」で選択可能なメニュー項目となります。メニュー1 メニュー2 メニュー3
更に返された値の処理系を記述。スクリプトqshdlg_smplの最後に以下を追加
セレクトビューで選択されたメニューの値は$INPUTから返されるので、その値を$RETで受けてcase文で場合わけしている。ここでは返された値(1〜3)に応じた文字をメッセージビューに表示させている。つまり、「メニュー1」を選択すれば「メニュー1が選択されました」と表示されることになります。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
ここでshowSelect()の行を
と書き換えてみます。こうするとセレクトビューの代わりに「メニュー1」「メニュー2」「メニュー3」のボタンが追加されて、メニューの代わりにボタンで選択が可能になります。echo 'showReply()' > $CONTROL
この様にqshdlgを使うと単純なシェルスクリプトでGUIな入出力系が簡単に作成可能となります。
注意事項:
オプションの-cで日本語コードが選べるけれどもeucJP以外で文字化けしてしまった、eucJPを使用するのが無難?
$CONTROLに文字列をリダイレクトする場合は、ダブルクォートとシングルクォートで二重に囲わないと上手く表示しない場合がある。
簡易ランチャーのようなものを作ってみました。
ザウルスのGUIなアプリケーションプログラムの本体は/home/QtPalmtop/bin/以下に存在します、ここのファイルリストをメニューに表示、選択させて起動させるという至って簡単なものです。
その1では
を使ってメニュー項目を作成しましたが、今回はecho 'item(QString,QString)' ラベル 値 > $CONTROL
を使用します、QStringが1個少ないので引数も「ラベル」しかありません、このメニューが選択された場合に返される値は「ラベル」そのものとなります。echo 'item(QString)' ラベル > $CONTROL
はセレクトビューに他のメニュー項目と一緒に表示されますが、選択はできない項目となります。メニューのタイトルや区切りのような使い方をさせる感じですか。echo 'label(QString)' '"ファイルリスト"' > $CONTROL
としてqcopコマンドでアプリケーションを起動させています。qcop QPE/System 'execute(QString,QString)' $RET
とすればOK。qshdlg select -A -t "sample2" -c eucJP -M &
注意:
表示されるファイルにはQTアプリケーションではないファイルもあるので選択実行は、「addressbook」「calculater」「datebook」など何をするアプリかがわかるもので実験すること。
簡単な電卓を作成しました。といっても整数の加減算しかできないへタレ電卓ですが(汗
乗除算も試したのですが上手くいきませんでした、ターミナル上の計算では上手くいくのですが、何故だろう?
起動すると画面下に「1」〜「0」、「+」「-」「=」「Exit」ボタンが出来るので計算ができます、終了は「Exit」ボタン
今回はボタンで入力を行うので、qshdlgはreplyモード?で起動します。オプションの-v で表示させるボタンのラベルと値を指定しています。もしラベルと値が異なる場合は-l オプションでラベル名を指定します。qshdlg reply -v "1,2,3,4,5,6,7,8,9,0,+,-,=,Exit" -A -f lcfont -t "sample3" -c eucJP -M &
標準で表示される「OK」「Cancel」ボタンは今回は必要ないので
で表示させなくしています、これはqshdlg起動時に-n オプションを指定することでも可能です。echo 'hideDefault()' > $CONTROL
押されたボタンの値は$INPUTから返されるので、もし数字ボタンと「+」「-」の場合は$STRに数式として追加させて、「=」の場合はexpr コマンドでその数式を評価して値を計算させます。
「Exit」ボタンが押された場合は
を実行、「Cansel」ボタンを押した場合と同じ動作をするので、これでプログラムを終了させています。echo 'reject()' > $CONTROL
今日はアイコン登録するのではなくターミナル上から、あるいはKeyHelper等から呼び出すタイプの実験をしてみました。と言っても殆ど同じですけど。
実行するとメッセージダイアログが表示して「メッセージを表示します」と出力されます。-h と-w はダイアログサイズの指定です
で入力待ちにすることで、「OK」か「Cancel」が押されるまでスクリプトの続きを実行するのを停止させています。while文がないとメッセージダイアログが表示していてもスクリプトは先を実行します。while文の有無でターミナルに“Message Dialog Close”が表示されるタイミングに注意。while read RET < $INPUT do done
次は値の入力
インプットダイアログを表示して入力された文字を$RETに代入しています、日本語も入力できました。インプットダイアログは上にメッセージビューがくっついてくるのでサイズ調整して見えないようにしています。入力された文字はメッセージビューにエコーバック表示されるみたいなのでこれが嫌な場合は -N オプション、パスワード入力のように入力欄の文字も隠したい場合は -P オプションをつけること。
なお、「Cancel」が押された場合は空文字が返されるみたいですね。「OK」や「Enter」で文字を入力した場合はダイアログが閉じないので
で閉じるようにしています。echo 'reject()' > $CONTROL