So-net無料ブログ作成

プロジェクトの流用 [Qt]

さて、インストールはしたものの、実際にクロスプラットフォームの開発に使えるのかが気になるところです。今回は先日NetWalkerで作成したプロジェクトがそのまま使えるのか試してみます。まずは、プロジェクトのディレクトリを丸々コピーしました。・・・そう言えば、オブジェクトとかもそのままでした・・。まあ、いいか・・。それも含めて試してみます。

それでは、Qt Creatorを立ち上げます。NetWalkerの時とは違って日本語化されています。バージョンの違いか、プラットフォームの違いかはよくわかりませんが・・。

10052500.png
日本語!


バージョンを確かめておきます。1.3.1とのこと。Qt 4.6.2がベースですね。

10052507.png
今年の2月にビルド


NetWalkerにインストールした後にビルドされてますね。NetWalkerの方もアップデートしてくれませんかねぇ・・。

ま、それはさておき、プロジェクトを読み込みます。「ファイル」→「ファイル/プロジェクトを開く」から難なく開くことができました。

10052508.png
「プロジェクトペイン」が2つ・・


「プロジェクト」の欄が2つありますね。無駄だ・・。まずは「ビルド」→「プロジェクト "Qt_learning" をクリーン」で余計なファイルを消して置きます。特に問題なし。

で、いきなり実行してみましょう。

*

・・・「プログラムを開始できませんでした。パスかパーミッションに誤りはありませんか?」と言われてしまいました。

10052509.png
両方が気になります・・


LinuxのNetWalkerからMacへのコピー。パスも変わってるし、パーミッションももしかしたら問題が出るかもしれません・・。


んんん〜〜〜。つづく。







MacでもQt [Qt]

前回でとりあえずコードを書くところまでは持って行けました。さて、Qtの特徴に「クロスプラットフォーム」と言うのがあります。と言うか、それを全面に出してますね。と言うことなので、ここで一旦Macにも入れてみようと思います。作ったものが両方で動けば、何かと便利な気もしますしね。

まずは、LGPL/無償ダウンロード版の Qt SDK for Macをダウンロードしました。中身はインストーラだけ。

10051800.png
インストーラですね


ダブルクリックでスタートです。さすがにコピーだけではダメなようですね。インストール可能かどうかを判断してもらって、インストール開始です。

10051801.png
英語です


こちら、Qt SDK 4.6ですね。NetWalkerに入れた方は4.5でしたので、バージョンが上がってますね。まあ、ええか。上記の説明によると以下のものがインストールされるようです。

導入物場所
Qt Creator、Qt Designer、QtLinguist/Developer/Applications/Qt
Qt Documentation/Developer/Documentation/Qt
Qt Examples/Developer/Examples/Qt
Qt Plugins/Developer/Applications/Qt/Plugins
Qt Frameworks/Library/Frameorks
Qt Libraries/usr/lib
qmake、moc、uic、etc../Developer/Tools/Qt(Symlink to /usr/bin)
Uninstall script/Developer/Tools/uninstall-qtsdk.py


インストールされる場所を見ていると面白いですね。ちゃんとMacの作法に倣っているようです。ついでに、アンインストールツールがインストールされるようですが、拡張子から見て、Pythonのスクリプトの様子。Python入ってんの?と思って確かめてみたら、入ってました。

10051802.png
Python入ってます


では、「続ける」です。「大切な情報」が表示されます。よく読んで「続ける」。続いて「使用許諾契約」。上部のプルダウンをクリックするとGPL v.3とLGPL v.2.1が含まれています。よく読んで「続ける」。同意を求められるので「同意」。

10051803.png
2つ含まれてますね


続いてインストールの準備です。必要な空き領域は1.72GB。インストール先を変更する場合は右下の「インストール先を変更...」を選べば良い様子。特に変更の必要性は感じません。

10051804.png
インストール先の変更時は右下のボタンをどうぞ


「カスタマイズ」のボタンを押してみたところ、インストールする内容を選択できる様です。別に削除する必要もないので、このまま「インストール」します。

10051805.png
特に削るものなし


続いて、パスワードの入力を求められました。入力して、OKです。インストール開始です。「待て」とのこと。

10051806.png
「ほかのインストール」って何ですかね?


なんか、表示が進まないので、失敗したかと思って、止めようかどうしようか悩んでいたところ・・、インストールが成功しました。なんじゃそれ・・?

10051807.png
成功しました


開発環境は基本的に「/Developer/Qt」以下に含まれていますので、「Developer/Qt」をDockに登録しておきます。・・・が、左側には登録できませんでした。仕方が無いので、右側の「アプリケーション」フォルダの隣に置いときました。

10051808.png
フォルダは左側には置けないのか・・


ちなみに、中身はこんな感じです。

10051809.png
同じアイコンばかり・・



今回はここまでで。

【参考】
Qt







クラスのメンバ変数の初期化 [C++]

とりあえず、Qt開発のとっかかりまでは来たのですが、C++自体について全く素人なので、ここで気になったものを取り上げていこうと思います。レベル的には初心者だと思っていますが、一応、C++については、大昔に少しだけ触ったことがあるのと、CとRubyはそこそこの経験があると言う程度のスキルです。

今回は、クラスのメンバ変数の初期化。普通にコンストラクタの中でやってもいいんですが、確かメンバ変数だけは特殊な方法があったような気がするなぁと思って調べてみました。

*

とりあえず、C++の仕様の場所を調べておこうかと思ったんですが、有償でしか見れないようですね・・・。普通に見れるページとしては、ISO向けの古いドラフトSTLのリファレンスっぽいページは見つけました。

さて、調べていたところ、下記の様にコンストラクタにメンバーイニシャライザというのをつけるのが正解の様です。

class Hoge {
public:
    Hoge() : a(1), b(2) {    //  a(1), b(2) がメンバーイニシャライザ
        ....
    }

private:   
    int a;
    int b;
};


あんまり使用する意味が感じられなかったので、この様な定義ができた意図が知りたかったんですが、とりあえず、このメンバーイニシャライザによって、「static指定されていないconstメンバ変数の初期化ができる」とのこと。なるほどですね・・。また、「クラス内に他のクラスのインスタンスをメンバとする場合に、デフォルトコンストラクタ以外を呼ぶことができる」とのこと。なるほど・・。後者はわかりにくいと思うので、リンク先の例を少し真似てみます。

こんな感じです。

class Hoge {
public:
    Hoge()  {    //  デフォルトコンストラクタ
        a = 0;
    }
    
    Hoge(int i) { // 引数intを持つコンストラクタ
        a = i;
    }

private:   
    int a;
};

class Foo {
public:
    Foo() {    // デフォルトコンストラクタ
        // イニシャライザが指定されていない場合は、
        // hogeにデフォルトコンストラクタが適用される
    }

    Foo(int i) : hoge(i) { // 引数にintを持つコンストラクタ
        // イニシャライザが指定されているため、
        // hogeには引数に従ったコンストラクタが適用される
    }

private:
    Hoge hoge;
}


んん〜〜〜。わかった気になってましたが、ちゃんとわかってないかも・・。先程のページの実行結果を見る限りは、メンバ変数に他クラスのインスタンスがある場合、自クラスのコンストラクタが呼ばれる前にメンバ変数のコンストラクタが呼ばれる様ですね。この為、コンストラクタの内部ではメンバ変数のコンストラクタを選択することはできないが、メンバーイニシャライザならば、その際のコンストラクタを指定できると言うことかな・・。これは、処理系依存でなくて、言語仕様なんですかね・・。

なお、ついでに下記の様な情報も入りました。




う〜ん、やっぱりわかってないことばかりですね・・。ま、おいおい調べていきます。


【参考】
C++ - Wikipedia
Standard Template Library Programmer's Guide - sgi
C++ Final Draft International Standard
C++入門:5章 クラスの包含-> メンバーイニシャライザ - 目指せプログラマー!
C++のコンストラクタとObjective-Cのイニシャライザの違い
メンバイニシャライザでの初期化順序 - G.ISHIHARA
第20章 constメンバ - C++編(言語解説)






ペンの追随の実装 [NetWalker]

さて、めちゃくちゃ長かったですが、ようやく実際の実装を行っていきたいと思います。とりあえずは、「qtlcanvas.h」と「qtlcanvas.cpp」に残りのマウス関連のイベント(「mouseMoveEvent()」と「mouseReleaseEvent()」)を追加します。

だいぶ慣れてきたと思ってましたが、コードを入力し始めると、NetWalkerのキーボードの悪さが目立ちますねぇ・・・。また、慣れるかなぁ・・。また、Qt Creator のエディタが遅い上に、ときどきフリーズしてしまいます。なので、前回設定した通り外部エディタを使っていますが、この外部エディタの立ち上げがいちいち面倒ですね・・。やっぱり、Qt Creator のエディタを使いたいです・・。

ちなみに、追加したコードはこんな感じ。

10050400.png
とりあえず、デバグコードのみ


で、ビルド&実行。・・・無事、動作しました。

10050401.png
ちゃんとログが出てます


さて、ちゃんと実装しますか・・。QPainterの使い方は以前大雑把に触れましたが、実際に実装してみると、ちゃんと線が引けませんね・・。一瞬、線が出てきてるんですが、すぐに消えてしまっています。しかも、やたらと実行時エラーが出ています。

実行エラーについては、painterをend()させ忘れていたので、それをすることで解決。一方、一瞬出て、すぐ消えると言うのは、描画をするたびにQWidgetが一から書き直されているための様ですね・・。これ、どうすればよかったですかねぇ・・。昔書いたソースを見てみたら、paintEvent()では、全ての描画をやり直してます・・。描画についてはこんな感じかな・・。

10050402.png
多分こんな感じ


ちなみに、たしか、レイアウトなども paintEvent() のタイミングで動作したと思うので、QWidget のサイズをレイアウトに任せている場合は、レイアウト後にサイズを取るために、resizeEvent()でサイズを取得する必要があります。

ちょっと、考えなおしが必要ですね・・。データを保持するクラスを作成して、widgetからはそちらにペンの位置などを指示するだけにします。

さて、編集します。NetWalker画面が広いので便利です。エディタが2枚開けます。

10050403.png
ヘッダを見ながらコーディング


オフスクリーンにQPixmapを使って、いろいろとRubyとC++の違いに戸惑いつつ、ビルドエラーを取っていったところ、何とかペンの軌跡の追随はできるようになりました。

10050404.png
まあ、描けましたが・・。


でも、遅いですね。イベントが発生するたびに全画面を描き直ししているので、仕方ないところでしょうか・・。更新された部分のみの描き直しで高速化できるのか・・。それとも根本的にやり方を変える必要があるのか・・。ま、最適化はおいおいやっていきましょうか・・・。







ブログを作る(無料) powered by So-netブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。