« Qt on Androidにプロジェクトを移行する際にハマったこと その2 | トップページ | あけましておめでとうございます »

2013年11月 8日 (金)

Qt on Androidにプロジェクトを移行する際にハマったこと その3

 さて、ずいぶんと間が開いてしまいましたが、さらに追記。あれこれググってみたりした結果、以前の問題がある程度解消しています。

◯ロケールがちゃんと取得できない、みたい。

 よく考えてみたら、ロケールを取得できないにしても、ロケールを設定できる方法はあってしかるべきです。というわけで、よく探してみたらありました。

    QApplication a(argc, argv);
    QLocale::setDefault( QLocale( QLocale::Japanese, QLocale::Japan ));

 とやってやれば、カレンダーやら数字やらがきちんと日本風に表示されるようになります。

◯QComboboxのプルダウンリストなどの文字サイズが最小化されてしまう問題。

 これについては、やはりフォント関係のバグの様で、以下の様にすればOKとのこと。

    androidDpi=QPaintDevice::physicalDpiX();
    androidFontsize=androidDpi/10; //割る数についてはお好みで。
    QFont myf=QApplication::font();
    myf.setPixelSize(androidFontsize);
    QApplication::setFont(myf);

 上記の様にすると、アプリ全体の基本的なフォントサイズをきちんと設定できます。

◯スクロールバーの幅が細くて、スクロールさせるのが大変。

 スタイルシートを設定してやればOK。ただし、コンボボックスの場合、スクロールバーだけ太くなると、見た目が悪いので、横のボタンも同時に太くしてやる必要があります。でも、別々に設定しようとすると、あとに設定したものだけ有効になってしまうので、まとめて設定する必要があります。とりあえず、こんな感じで問題なし。

    QApplication a(argc, argv);
    a.setStyleSheet(QString::fromUtf8("QScrollBar:vertical {"
                                      "    border: 2px solid #999999;"
                                      "    background:white;"
                                      "    width:50px;    "
                                      "    margin: 0px 0px 0px 0px;"
                                      "}"
                                      "QScrollBar::handle:vertical {"
                                      "    background: qlineargradient(x1:0, y1:0, x2:1, y2:0,"
                                      "    stop: 0  rgb(140, 160, 170), stop: 0.5 rgb(140, 160, 170),  stop:1 rgb(140, 160, 170));"
                                      "    min-height: 0px;"
                                      ""
                                      "}"
                                      "QScrollBar::add-line:vertical {"
                                      "    background: qlineargradient(x1:0, y1:0, x2:1, y2:0,"
                                      "    stop: 0  rgb(160, 160, 160), stop: 0.5 rgb(160, 160, 160),  stop:1 rgb(160, 160, 160));"
                                      "    height: 0px;"
                                      "    subcontrol-position: bottom;"
                                      "    subcontrol-origin: margin;"
                                      "}"
                                      "QScrollBar::sub-line:vertical {"
                                      "    background: qlineargradient(x1:0, y1:0, x2:1, y2:0,"
                                      "    stop: 0  rgb(160, 160, 160), stop: 0.5 rgb(160, 160, 160),  stop:1 rgb(160, 160, 160));"
                                      "    height: 0px;"
                                      "    subcontrol-position: top;"
                                      "    subcontrol-origin: margin;"
                                      "}"
                                      "QComboBox {"
                                      "border: 1px solid gray;"
                                      "border-radius: 3px;"
                                      "padding: 1px 18px 1px 3px;"
                                      "min-width: 6em;"
                                      "}"
                                      "QComboBox:editable {"
                                      "    background: white;"
                                      "}"
                                      "QComboBox:!editable, QComboBox::drop-down:editable {"
                                      "     background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
                                      "                                 stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,"
                                      "                                 stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);"
                                      "}"
                                      "QComboBox:!editable:on, QComboBox::drop-down:editable:on {"
                                      "    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
                                      "                                stop: 0 #D3D3D3, stop: 0.4 #D8D8D8,"
                                      "                                stop: 0.5 #DDDDDD, stop: 1.0 #E1E1E1);"
                                      "}"
                                      "QComboBox:on { /* shift the text when the popup opens */"
                                      "    padding-top: 3px;"
                                      "    padding-left: 4px;"
                                      "}"
                                      "QComboBox::drop-down {"
                                      "    subcontrol-origin: padding;"
                                      "    subcontrol-position: top right;"
                                      "    width: 50px;"
                                      "    border-left-width: 1px;"
                                      "    border-left-color: darkgray;"
                                      "    border-left-style: solid; /* just a single line */"
                                      "    border-top-right-radius: 3px; /* same radius as the QComboBox */"
                                      "    border-bottom-right-radius: 3px;"
                                      "}"
                                      "QComboBox::down-arrow {"
                                      "    image: url(/usr/share/icons/16x16/downarrow.png);"
                                      "}"
                                      "QComboBox::down-arrow:on { /* shift the arrow when popup is open */"
                                      "    top: 1px;"
                                      "    left: 1px;"
                                      "}"
                                      ""));

 赤字の部分は最低限、必要に応じて変更しないといけないところです。

 サンプルファイルやら、フォーラムの書き込みあたりから探してきたので、出典がどこか、分からなくなってしまっているのは御勘弁くださいませ。

◯Androidとそれ以外で処理を分ける。

 まあ、上記のような感じでAndroid用の処理が入ってくると、さすがに処理を分ける必要が出てきます。というわけで、以下のようにしてやればOKです。

#ifdef Q_OS_ANDROID
 Android用の処理
#else
 それ以外の処理
#endif

 これら以外にも、試行錯誤で気がついた部分などありますが、時間がないので、また別の機会に。ただ、実機でプログラムを動作させていると、スリープ後にハングアップしてしまうことがあります。その場合、「Fast Reboot」をインストールしておくと、すぐに復帰させることができるので、オススメです。

閑話休題

前の記事から随分間が開いてしまいました。単純に忙しかった、という事もありますが、それ以外にも、Qt5.1.1や5.2.0betaが出たので、あれこれ試してみたりもしてました。

が、しかし、・・・orz。

あくまでも個人的な意見で、かつ、Qt4で作成していたプロジェクトを移行する場合、という条件付きですが、

Qt5.1.1
 あれこれ試してみたが、実機で動かした場合、画面表示などがNecessitasの場合よりも崩れるなど、トラブルが多いのでパス。

5.2.0beta
 Ministroが対応していないため、実機で動かすのに支障があるので、パス。というか、ビルド&デプロイも、5.1.1より問題が多い感じで、まだ本格的に実機のアプリ作成には使えない感じ。ちなみに、QtCreatorの3.0が、VirtualBoxのUbuntuで起動しないというトラブルに遭遇しましたが、仮想マシンの3Dアクセラレータのチェックを外してやったら起動するようになりました。仮想環境で開発される方はご注意ください。

というわけで、結局、当面はNecessitasでの開発を続けることに決定。という感じで落ち着いています。早くQt5.2の方にも移行したいなぁ、とか思っているんですが、もうちょっと情報が増えるのを待つ感じですね。

|

« Qt on Androidにプロジェクトを移行する際にハマったこと その2 | トップページ | あけましておめでとうございます »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Qt on Androidにプロジェクトを移行する際にハマったこと その3:

« Qt on Androidにプロジェクトを移行する際にハマったこと その2 | トップページ | あけましておめでとうございます »