なんか opie 普及委員やっとるよーな気分になってくるが ... つーか、某所でopie 普及委員する訳なんだが、ま、それはともかく。
libqte を rebuild すれば大部分は組み込むこともできなくはないが、外されている理由もなくはなく、 ためしに QFileDialog, QFontDialog を全画面表示してみた時に分かった:
... スクリーンが狭くて使う気がせん。てか、使えん。 C7x0 だと使える(QFontDialog の例) かもしれないけど、 他の部分でほとんど VGA への配慮がないのに VGA で表示するのを前提にされても困る。![]()
![]()
まぁ QColorDialog は普通に使えそう↓なんで、 Qtopia に付属するアプリが使わない widget は全部省いてしまったてのが真相な気もするが :-p
qt-embedded と qt-x11 と、tarball を分けるくらいなら dialog の類も embedded 向けのデザインしといてくれればいいのに。 ... という思いから発したのかどーかは知らんが、Opie には、これら外された dialog を代替する dialog がある。 それらは libopie に組み込まれ、 Opie 環境とではなく Qtopia 環境でも使うことができるようになっている。
よって書くこともなし :-)
この項、初期稿で 「OFileDialog の実装についての発言がここにいたるまで微妙にヨーイングしてるのだが、 FileSelector, OFileSelector, OFileDialog::OFileDialog(), OFileDialog::getOpenFileName() などのポリシーやら構成やらが複雑怪奇で よーわからんかったということで勘弁、 ... 実はまだ違ってたりしたらヤだな (^^;;」なんて書いてたらやっぱ違うし ...。
ええと、整理すると、Opie の file dialog に関する入口は大別して 5 種類ある。
enum OFileSelector::Mode {OPEN=1, SAVE=2, FILESELECTOR=4, DIR=8 };
というフラグで動作を切替えることができるようになった。
ちなみにこれ、いかにも "OPEN | FILESELECTOR" みたいに OR で繋いで表記できそうだが、
ぜんぜんそうなってない。個別に指定することしかできない。
OFileSelector(const QString &mimeFilter, QWidget *parent,
const char *name, bool newVisible = TRUE,
bool closeVisible = FALSE );
で、もちろん Mode を指定することはできず、Mode = FILELSELECTOR として動作する。
つまり、まさに Qtopia 的に探査する。ちなみに qpdf では opie- か qpe- かで
OFileSelector::OFileSelector() と FileSelector::FileSelector() を使い分けているが、
両者は文面そのまんま差し替えがきくほど互換性がある。
OFileDialog::getOpenFileName()、OFileDialog::getSaveFileName() もまた、 Mode を指定できない。こちらはそれぞれ Mode = OPEN, Mode = SAVE として動作する。 Qtopia にも Qt にも対応する関数はないから、当然のように勝手にやっている。 ... ま、当然か。
OFileDialog::OFileDialog() 及び 新しいほうの OFileSelector::OFileSelector() を引数までちゃんと書くと:
OFileDialog::OFileDialog(const QString &caption,
QWidget *, int mode, int selector,
const QString &dirName,
const QString &fileName = QString::null,
const MimeTypes &mimetypes = MimeTypes() );
OFileSelector::OFileSelector(QWidget *wid, int mode, int selector,
const QString &dirName,
const QString &fileName = QString::null,
const MimeTypes &mimetypes = MimeTypes() );
で、いずれも mode を指定できる。
OFileSelector::OFileSelector() が Opie の file dialog の本体、
OFileDialog::OFileDialog() がその wrapper になる。
OFileDialog::OFileDialog() は Qt の QFileDialog::QFileDialog() と名前が似てるけど、
FileSelector の時と違って関数としての互換性はほとんどない。
これらを通常のアプリから呼ぶことはない。 下方探査させないなら OFileDialog::getOpenFileName() を呼べばいいし、 下方探査させるつもりなら Qtopia 互換のほうの OFileSelector::OFileSelector() を使ったほうが Qtopia への移植が楽だ。
にもかかわらず、この二つをここで挙げるのは、OFileDialog::getOpenFileName() 等が内部で OFileDialog::OFileDialog()を呼んでいて それがさらに OFileSelector::OFileSelector() にたどり着き、 すげー紛らわしいからである ... ちょい見には OFileDialog::getOpenFileName() も下方探査してるように思える。
どれくらい紛らわしいかというと、今日(6/10) の 2 時間ばかりのあいだに 4, 5 回書き直されたこの項や、 3/21 の項での混乱がその例だ (^^;
さて。
ひとつめが OFileSelector (もちろん古いほう)で、 二つ目のが OFileDialog::getOpenFileName()。![]()
![]()
OFileDialog::getOpenFileName() 的なほうがいいからといって OFileDialog::OFileDialog() や OFileSelector を使って全探査してるトコを 探査なしの挙動に書き換えてしまえとはなかなかいかない。 哲学的なレベルで対立するだけあって関数前後の書き方がかなり違うので。 実際 opie-qpdf でさえ、いまだ OFileSelector (の全探査) を使っている。 qpe-qpdf ならともかく Qtopia に縛られない opie-qpdf のほうは移行すりゃええのに〜 と思いつつ手つかずのままだ。
一つめのが標準的な OFontSelector。 念のためだが、下半分の "The Quick ..." のサンプルテキスト部分を含めてこれ全体が OFontSelector である。 引数の withpreview = true とするとこーなる。
二つめのは Opie の Apearance で、 こちらはサンプルテキスト部分を無くして使っている (withpreview = false)。 "Sample" 部分はというと、SampleWindow として Apearance 内で自前で実装されている。
なお、Qtopia 1.6.x の Apearance にも font menu がある↓が、 こちらは QComboBox などを使って直接実装してあって、 fontmenu の形で widget を分離できるようにはなってない。
QPrintDialog のほうは Qt 層で実装がないと Opie 側ではどーしよーもないのでどーしよーもないす。
Qt Designer は libopie のことを知らないため、これらの widget を扱うことができない。 そういう場合に custom widget を組み込むこともできることになっているが、 uic で .cpp 化した時に書式が合わないので使いものにならない。 uic は custom widget を QWidget の導出クラスとみて (それは正しい仮定なんだが) QWidget(QWidget *, const char *, WFlags) という形で呼ぼうとするが、 libopie の各クラスはどれもそんなコンストラクタを持ってないんである。 OFileDialog::getOpenFileName() に至ってはコンストラクタでさえない。 もっとも、この場合は widget でさえないから frame widget に貼りつけようもないが ...
Opie 側が Qt のルール破りなのかもしんないが、Qtopia との整合性の都合やらなんやらで そういう訳にもいかんのだろう。OFontSelector で言えば、
という形をしているが、withpreview にデフォルト引数が設定されてなくて、 OFontSelector(QWidget *parent, const char *name, WFlags fl ) という形では呼び出せない。 型的には withpreview にデフォルト引数設定しておいても大丈夫なんじゃないかな ... と思いつつまだ見てないけど。OFontSelector::OFontSelector ( bool withpreview, QWidget *parent, const char *name, WFlags fl );
手で書くぶんにはぜんぜん困らんし、
これらをどっかの frame widget の中に収めた .ui を書くというケースも稀かもしんないが、
でも QTabWidget の中に入れようとしてハマった奴もいると
(← simple konsole の font menu の部分のことだけども)。
で、uic に手ぇ入れて対応させようと uic のソース眺めて 10 秒ほどで pending した。
widget の名前やら宣言の破片やらが直接ソース中に散りばめられている。
この書き方で Qt の version up に追従してるというのが凄いというか無茶苦茶というのか :-O
これ、同じ呼び出し方をするかぎり拡張はなんとかなるが、
そうでない widget を付け加えるのはしんどい。Qt Designer, uic の Opie 対応がぜんぜん進んでない訳である。
もちろん Opie 側に uic 対応な wrapper キットでも付けといてくれるだけでいい。
... てか、自前で書けという話もないでもないが ...
Opie の Appearance は Qt Designer を使わず(使えず)直接 .cpp や .h を書いてあるのに対し、 Qtopia の Appearance は Qt Designer を使って書かれている。 代わりに Font Widget を持てないが。 方針に一長一短があるというか ... もうね、さっさと統一しろと(略)
近所 には libqte, libqpe や Opie の PIM 固有のクラスの document (というにはあまりに簡素だが) もある。
doxygen でソースを整形しただけのよーなもんで、 意味のある内容はあんまりないかもしんないが、 読んどかないことには関数宣言のたぐいはやっぱ分からん訳で。