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の方にも移行したいなぁ、とか思っているんですが、もうちょっと情報が増えるのを待つ感じですね。

| | コメント (0) | トラックバック (0)

2013年8月27日 (火)

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

無事、実機でデバッグできるようになったのはいいんだけど、不具合もいっぱい。まあ、自分のいい加減な作り方が悪い部分も(いっぱい)あるんだけど・・・。

○配色がおかしい&メニューの中身が真っ黒になってしまう、などなど

スタイルをちゃんと指定していないのが原因。アプリケーションを作成した後に、設定してやればOK。

    QApplication a(argc, argv);
    QPlastiqueStyle* as = new QPlastiqueStyle();
    a.setPalette( as->standardPalette() );
    a.setStyle(new QPlastiqueStyle());

Android用のスタイルもあるんだけど、すべてのウィジェットに対応できていないようなので通常のスタイルを設定してます。

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

というわけで、ファイルを保存すると文字化けしてしまったりするので、これも初めに指定。

    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale( QTextCodec::codecForName( "UTF8" ));
    QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "UTF-8" ));

○QDialogを継承したクラスで、フォントサイズがおかしくなる。

と言い切っていいのかどうかは分かりませんが、アプリ全体のフォントサイズは、

    int normalFontSize = 8;

 QApplication a(argc, argv);
    QFont f = a.font();
    f.setPointSize( normalFontSize );
    a.setFont( f );

てな感じで指定できます。でも、ダイアログを開くと、一部で巨大化した文字表示されてしまいます。というわけで、ダイアログのコンストラクタで、おかしくなるフォントのサイズを指定してやることで修正。

    QFont fn = ui->label->font();
    fn.setPointSize( normalFontSize );
    ui->label->setFont( fn );

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

    ui->comboBox->setFont( fn );

てな感じでやってみたら、エディタ欄に表示されている文字は大きくなるんだけど、プルダウンリストの文字には反映されません。これについては現在解決法が見つかりません。頭の痛いところです。

でも、まあ、Linux上で作成したものが、当たり前のようにAndroid端末で動いてしまうというのは、何というか、感動するものがありますね。よい時代になったものです。

| | コメント (0) | トラックバック (0)

2013年8月23日 (金)

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

さて、ある程度、形が出来上がってきたので、Linux環境(以下、環境L)で作成しているプログラムをAndroidに移植してみることにしました。と言っても、ソースはそのまま使えるはずなんですが・・・。

とか言いながら、やっぱりはまるところがあったので、メモ。開発環境は、仮想環境に構築したUbuntuにLxdeを入れた上で、Necessitas(以下、環境N)を導入してあります。

まず、ソースの移行方法は、もっとスマートな方法がありそうな気はするけれど、よくわからないので、環境Lの方で作ってるやつをフォルダごとUSBにコピーして、環境Nにコピー。その後、".pro"".pro.user"ファイルを削除して、端末を起動して、ソースフォルダからqmakeを起動してプロジェクトを新規に作成。うちの場合だと、こんな感じ。

> ../necessitas/Android/Qt/482/armeabi/bin/qmake -project

その後、QtCreatorで読み込むと、プロジェクトの初期設定画面になるので、右下のボタンを押して、プロジェクトを作成。

その後は問題なく動くんだけれど、ビルドすると、

> cannot find ELF information

というエラーが出て、AVDでも実機でも実行できない。と言うか、AVDでは、MinistroIIのダウンロードができなくて、だめなんだけど。でも、実機でも動かない。

あれこれやってみてもどうにもならず、頭を抱えつつ、メッセージをたよりにググってみると、

> 「画面左の「プロジェクト」をクリックして、「Deployment」の
> 「Package Configurations」の「Application」のところを*見れば*分かる。」

というようなメッセージが。という訳で見てみると、「Run」の項目に入るはずの実行ファイルの名前が空欄になっています。が、編集しようとしても、編集できません。

しばし悩んでから、先ほど新規作成したプロジェクトファイルを見ると・・・、分かりました。

> TEMPLATE = app
> TARGET =  ・・・ こいつが犯人。
> DEPENDPATH += .

という訳で、

> TEMPLATE = app
> #TARGET =
> DEPENDPATH += .

と修正してやることで、無事、実機での実行ができるようになりました。めでたしめでたし。

| | コメント (0) | トラックバック (0)

2013年8月 6日 (火)

QStringのファイル入出力について

もっといい方法があるのかもしれないけれど、とりあえずこのパターンでうまくいっているので、メモ。

<<出力>>

ofstream out;
QString txt = "テストです";

out << txt.toLocal8Bit().data() << std::endl;

<<入力>>

char buff[ MAX ];
ifstream in;
int pos = 0;
char c;

in.get( c );

while (( c != '\n' )&&( !in.eof() )){
        if ( pos <= MAX ) buff[ pos++ ] = c;
        in.get( c );
}
buff[ pos ] = 0;

QString ts="";

if ( buff[ 0 ] != 0 ){
        ts = QString::fromLocal8Bit( buff );
}

てな感じ。

| | コメント (0) | トラックバック (0)

2013年7月24日 (水)

QTableViewについてあれこれ

まあ、あとで追加もあると思いますが・・・。

○コラムヘッダのテキスト設定
QTableViewではなく、Viewにセットするモデルの方に設定する。

○マウスイベントの取得
QTableView→Viewport()→installEventFilter(this);
で、マウスイベントを、親の方で取得できるようにして、
親のeventFilter()で処理する。

○マウスでクリックされたセルの取得
ui→tableView→rowAt( e→y() );・・・行
ui→tableView→columnAt( e→x() );・・・列

〇キーイベントの取得
Viewportではなく、tableViewに対して、eventFilterをセットする



| | コメント (0) | トラックバック (0)

2013年7月23日 (火)

画面サイズの取得

QDesktopWidgetを生成して、情報を取ればOK。

QDesktopWidget d;
d.width();

てな感じ。



| | コメント (0) | トラックバック (0)

2013年7月22日 (月)

新規作成

ザウルスがさすがに古くなってきたので、昔に作ったプログラムをANDROID用に移植することにしました。
と言っても、オリジナルはQt2.4世代。今やQt5の時代、そのままではコンパイルも通りません。というわけで、新規作成。
せっかくなので、気がついたことや、(忘れてしまって)ハマったことを記録していこうと思います。

と言うことで、先ずはー発目。

MainWindowのジオメトリの左上を(0,0)で指定してしまうとメニューバーが画面上部にはみ出してしまって終了できなくなる。(0,0+menuBar->height())としてやることで解決。



| | コメント (0) | トラックバック (0)

2013年4月15日 (月)

文庫エディター2 v.0.6です

えらく遅くなってしまいましたが、新バージョンです。

「bunkoeditor2_for_ubuntu_v06.tar.gz」をダウンロード

Mac版は例によってDropbox経由でどうぞ。

bunkoeditor2_for_mac_v06.dmg

背景ファイルが必要な方はこちらからどうぞ。

大きな変更は、前回書いたとおり、

 ・行末揃えに対応
 ・Zipファイル作成機能の実装

ということになります。残念ながら、環境が復旧していないので、NetWalker版はありません。

Zipファイル作成モードに入るには、ビューワー画面で、「Z」キーを押してください。

とりあえず、サンプルとして「854x480」と「1200x800」の2パターンの設定をボタンで登録して有ります。HTCのバタフライで使うのであれば、「854x480」の設定で問題ないと思います。実際、私はそれで使ってます。

自分の環境に合わせて試行錯誤されることになると思いますので、デフォルトでは10ページ目までの「プレビュー版」が作成されるようになっています。本番のファイルを作成する場合には、「プレビュー」のチェックを外してください。指定した数値は、作成後自動的に保存され、次回に引き継がれます。

しかし、未だに検索・置換機能が実装されていないというのが・・・。自分でやってることなんだけど、遅いにもほどがありますねぇ。

さて、ちょっと言い訳がてら、備忘録としてメモ。

新しいMacに開発環境をセットアップして、例によってmacdeployqtで正常に動作するバイナリが作成できないので、ソースからビルド&インストール。しかし、どういうわけか、QtCreatorから見つからない。

というわけで、しばらくハマりました。前回、問題なくいけたもんだから、原因に気がつくのに少々時間がかかりまして・・・。

結論としては、前回は旧バージョンのOSから環境を引き継いでいたので、問題なかったんですね。現在のOSのバージョンでは、Qtがインストールされる「/usr」以下が不可視属性になっているので、属性を変更してやる必要があった、という事です。しょーもない。

というわけで、ターミナルを起動して、

>sudo chflags nohidden /usr

で解決しました。

| | コメント (0) | トラックバック (0)

2012年11月12日 (月)

文庫エディター2 v.0.5a Mac用テスト版です(^^;

さて、文庫エディター2 v.0.5aのMac版です。サイズが大きくてココログではアップできないので、Dropbox経由での公開です。動作イメージについては、過去の記事を御覧下さい。操作方法については、この辺この辺を。あとは、Hキーを押してヘルプを見て下さいませ。

OSX 10.5.8以降なら大丈夫だとは思いますが、全画面モードで起動するので、もしうまく動作しないときは慌てずにカーソルを画面最上部に持って行って下さい。メニューバーが出ますので、そこから終了できます。なお、それでも終了できない場合は、リンゴマークから強制終了して下さい・

・・・。いい加減、マニュアルを書かないといけませんねぇ・・・。

一応、OSX 10.5.8と10.7.4で動作確認はしていますが、それ以外の環境でのテストはできていません。あくまでテスト版ということで、自己責任でお試し下さい。・・・、といっても、ただでさえユーザーの少ない文庫エディター2、Mac用をダウンロードする人がいるのかどうかは、分かりませんが(^^;。なお、7.5MB程ありますので御注意下さい。

ダウンロード

<インストール>

dmgファイルになっていますので、ダブルクリックでマウントし、中にあるbunkoeditorをアプリケーションフォルダにコピーして下さい。別途Qt4をインストールする必要はありません、というか無いはずです。
なお、現時点では背景ファイルが入っていませんので、背景は設定できません。というか、背景ファイルを入れてパッケージを作る方法に自信がないので・・・。
分かる方は、パッケージの中の実行ファイルと同じ場所に、以下の2つのファイルを置いて下さい。そうすれば、背景の設定は可能です。

「bg_file.jpg」をダウンロード
「bg_file_l.jpg」をダウンロード

もし、私が試した環境以外で動作確認が取れた場合は、コメントで知らせていただけると助かります。それでは。

追記

ちなみに、バージョンが0.5aになっているのはバグ修正のためです。ページの最後が行末禁則文字の場合、次のページで表示されない、というバグの修正です。Netwalker版とUbuntu版も、数日中にはアップします。

| | コメント (0) | トラックバック (0)

macdeployqtで正常に動作するイメージが作れない件について

QtSDKを公式からダウンロードして使っていたわけですが、Mac用の配布バイナリを作成するmacdeployqtで、どうやっても正常に動作する実行ファイルが作れませんでした。
んでもって、ネットで調べてみると、どうもQtSDKには「不具合がある」という感想が多いようで、ソースからビルドすることを進めているページもありました。

というわけで、公式からソースを拾ってきてビルド&インストールしてみました。結果、あっさりと動作するイメージを作成できてしまいました。今までの苦労は何だったのか・・・orz。

教訓

「お手軽なパッケージを安易に信用しないこと。うまくいかないときは自前でビルドしてみること。」

基本は大事だ、ということでしょうか。でも、公式が配布しているんだから、信用するのも無理はないですよねぇ・・・。

| | コメント (0) | トラックバック (0)