ペンの追随の実装 [NetWalker]
さて、めちゃくちゃ長かったですが、ようやく実際の実装を行っていきたいと思います。とりあえずは、「qtlcanvas.h」と「qtlcanvas.cpp」に残りのマウス関連のイベント(「mouseMoveEvent()」と「mouseReleaseEvent()」)を追加します。
だいぶ慣れてきたと思ってましたが、コードを入力し始めると、NetWalkerのキーボードの悪さが目立ちますねぇ・・・。また、慣れるかなぁ・・。また、Qt Creator のエディタが遅い上に、ときどきフリーズしてしまいます。なので、前回設定した通り外部エディタを使っていますが、この外部エディタの立ち上げがいちいち面倒ですね・・。やっぱり、Qt Creator のエディタを使いたいです・・。
ちなみに、追加したコードはこんな感じ。
とりあえず、デバグコードのみ
で、ビルド&実行。・・・無事、動作しました。
ちゃんとログが出てます
さて、ちゃんと実装しますか・・。QPainterの使い方は以前大雑把に触れましたが、実際に実装してみると、ちゃんと線が引けませんね・・。一瞬、線が出てきてるんですが、すぐに消えてしまっています。しかも、やたらと実行時エラーが出ています。
実行エラーについては、painterをend()させ忘れていたので、それをすることで解決。一方、一瞬出て、すぐ消えると言うのは、描画をするたびにQWidgetが一から書き直されているための様ですね・・。これ、どうすればよかったですかねぇ・・。昔書いたソースを見てみたら、paintEvent()では、全ての描画をやり直してます・・。描画についてはこんな感じかな・・。
多分こんな感じ
ちなみに、たしか、レイアウトなども paintEvent() のタイミングで動作したと思うので、QWidget のサイズをレイアウトに任せている場合は、レイアウト後にサイズを取るために、resizeEvent()でサイズを取得する必要があります。
ちょっと、考えなおしが必要ですね・・。データを保持するクラスを作成して、widgetからはそちらにペンの位置などを指示するだけにします。
さて、編集します。NetWalker画面が広いので便利です。エディタが2枚開けます。
ヘッダを見ながらコーディング
オフスクリーンにQPixmapを使って、いろいろとRubyとC++の違いに戸惑いつつ、ビルドエラーを取っていったところ、何とかペンの軌跡の追随はできるようになりました。
まあ、描けましたが・・。
でも、遅いですね。イベントが発生するたびに全画面を描き直ししているので、仕方ないところでしょうか・・。更新された部分のみの描き直しで高速化できるのか・・。それとも根本的にやり方を変える必要があるのか・・。ま、最適化はおいおいやっていきましょうか・・・。
だいぶ慣れてきたと思ってましたが、コードを入力し始めると、NetWalkerのキーボードの悪さが目立ちますねぇ・・・。また、慣れるかなぁ・・。また、Qt Creator のエディタが遅い上に、ときどきフリーズしてしまいます。なので、前回設定した通り外部エディタを使っていますが、この外部エディタの立ち上げがいちいち面倒ですね・・。やっぱり、Qt Creator のエディタを使いたいです・・。
ちなみに、追加したコードはこんな感じ。
とりあえず、デバグコードのみ
で、ビルド&実行。・・・無事、動作しました。
ちゃんとログが出てます
さて、ちゃんと実装しますか・・。QPainterの使い方は以前大雑把に触れましたが、実際に実装してみると、ちゃんと線が引けませんね・・。一瞬、線が出てきてるんですが、すぐに消えてしまっています。しかも、やたらと実行時エラーが出ています。
実行エラーについては、painterをend()させ忘れていたので、それをすることで解決。一方、一瞬出て、すぐ消えると言うのは、描画をするたびにQWidgetが一から書き直されているための様ですね・・。これ、どうすればよかったですかねぇ・・。昔書いたソースを見てみたら、paintEvent()では、全ての描画をやり直してます・・。描画についてはこんな感じかな・・。
多分こんな感じ
ちなみに、たしか、レイアウトなども paintEvent() のタイミングで動作したと思うので、QWidget のサイズをレイアウトに任せている場合は、レイアウト後にサイズを取るために、resizeEvent()でサイズを取得する必要があります。
ちょっと、考えなおしが必要ですね・・。データを保持するクラスを作成して、widgetからはそちらにペンの位置などを指示するだけにします。
さて、編集します。NetWalker画面が広いので便利です。エディタが2枚開けます。
ヘッダを見ながらコーディング
オフスクリーンにQPixmapを使って、いろいろとRubyとC++の違いに戸惑いつつ、ビルドエラーを取っていったところ、何とかペンの軌跡の追随はできるようになりました。
まあ、描けましたが・・。
でも、遅いですね。イベントが発生するたびに全画面を描き直ししているので、仕方ないところでしょうか・・。更新された部分のみの描き直しで高速化できるのか・・。それとも根本的にやり方を変える必要があるのか・・。ま、最適化はおいおいやっていきましょうか・・・。
コメント 0