So-net無料ブログ作成
検索選択

バックアップツール [NetWalker]

手書きのメモをタラタラやっているうちに、NetWalkerに入っているデータが増えてきたので、バックアップツールが欲しくなってきました。Ubuntu用にもいろいろある様ですが、せっかくなので、単純なツールを作ってみることにしました。と言うことで、手書きメモは一旦置いて、寄り道です・・。

大まかな仕様は下記の通り。



いずれ、実装したいのは下記の通り。



バックアップ先はネットワーク越し(SMBサーバ)を考えているので、SMBのクライアント機能は最初から実装したいんですが、どの程度の手間がかかるんですかねぇ・・。とりあえず、バックアップ先が接続されているかどうかは前回バックアップ日時の存在と、指定ディレクトリの存在を見て判断することにします。後、単純なコピーで考えているので、リストア機能はつけません。

画面案は下記の通り。



コピー元はリストで表示して、横の「+」「-」ボタンで追加、削除するようにしたいと思います。追加が可能なことでコピー元のディレクトリが増えるので、スクロールも必要になりますね。また、削除の対象を選択するためにも、少なくとも一つの項目を選択できるようにしなければいけませんね・・。これにはQListViewを利用したいと思います。ボタンはQPushButtonですね。

コピー先は一つのみ指定できることにします。コピー時には「コピー先」のディレクトリをルートとし、「コピー元」として選択したディレクトリのパスをそのまま作成することにします。コピー元に同じディレクトリパスが存在した場合は、追加時にはじくことにしましょうか・・。この領域にはQLineEditを、ボタンは上と同じQPushButtonを利用したいと思います。

また、それぞれのディレクトリの指定にはQFileDialogが使えると思います。

で、両領域の間にある下矢印のボタンをバックアップ開始のボタンとしたいと思います。これもQPushButtonですね。

その下の領域の「進捗」のところはバックアップの進捗状況を表示したいと思います。いずれは、ログとして保存できるようにしてもいいですかね・・。ここはQTextEditでいいですかねぇ・・。

*

と言う感じで、作ろうかとまずは Qt Designer で部品を配置しました。・・が、よく考えたらレイアウトを使わないと・・・。


つづく。




   

SVGから内部形式データへの変換4 [Qt]

さて、前回で準備はできたんですが、改めてログを確認したところ、QPaintEngine::drawPolygon()で渡されている引数は線が分断されてますね・・。

ま、こんな感じですね。




これは、最初に描画する際にQPainter::drawLine()を利用していることに起因するような気がしますね。これをQPainter::drawPolyline()でも使えば、思い通りに一本の線と言う扱いになるのかもしれませんが、ここでは気にしないでいましょう。

*

一通り、実装して実行したところ、「QPainter::setPen: Painter not active」など、QPainterがアクティブでないと言うエラーメッセージがバンバン出てきました・・。何か、初期化動作が足らないようです・・。QPaintEngineの説明をもう一度読み直しますか・・。



・・・見てたら、QPaintEngine::begin()で、trueを返していないのに気がつきました。bool型の関数なのに、何も返してませんね。でも、これを直しても、関係ありませんでした。

ログをよく見てみたら「QPainter::begin: Paint device returend engine == 0, type: 0」と言うメッセージが出てますね。一応、QPaintdevice::paintEngine()は実装していて、ちゃんとpaintEngineを返す実装はしているつもりなんですが、うまく動いていないんでしょうか・・?

・・・うまく動いていない様ですね・・。ログを出してみたら、NULLを返してました・・。なんででしょう・・。

って、QtlSvgConvEngineと言うクラスがQPaintEngineを継承したクラスなんですが、QtlSvgConvertorのコンストラクタでこれのインスタンスを生成していながら、それを記憶していませんでした・・・。ちゃんと記憶させたところ・・。

こう書いたのが・・・、

10101900.png
保存は前試した


ちゃんとこう復元されました。

10101901.png
読み出し成功!


とりあえず、保存・読み込みは完了です。って、私はソースを見ながらここにメモ書きしてるんですが、ここにソースを載せないと読んでる人には意味不明ですね・・。どうしようかな。


つづく。





   





★書店売上No.1ビジネス週刊誌!!★【週刊ダイヤモンド】定期購読は最大45%OFF!!★送料無料


SVGから内部形式データへの変換3 [Qt]

先週はばたばたしていて、飛ばしてしまいました。さて、前回、描画先のサイズの違いによる座標系の変換について悩んだんですが、実際どのように通知されているのかと、次の手順で、試してみました。

 ・起動後、ウィンドウサイズを拡大
 ・メモを書き込み
 ・終了  ←ここで、データを保存
 ・起動  ←ここで、データを読み込みログ出力

以上で出力された際のログを見たところ、以前出力されたログとは異なり、QPaintEngine::drawPath()やQPaintEngine::drawPolygon()は呼ばれていません。代わりにQPaintEngine::drawImage()が呼ばれています。ちなみに、QPaintEngine::updateState()の値も以前とは異なるようです。

詳しく見ていませんが、どうやらdrawImage()は全体の画像を細切れにして呼ばれている様です。また、SVGデータの中身とdrawImage()の引数を比べると、どうも座標系の変換は行われた上で、drawImage()が呼ばれているように感じます。今回は読み込み時は画像の縮小になるため、出力する位置も重複してしまっているようですね。ま、細かい動きはいいでしょう。データの保存時と読み込み時の画像のサイズを合わせないと筆跡の座標が取れないことがわかりました。ちゃんとやるには、今の実装に色々と手を加えなければいけない気がしたので、とりあえず今のところはウィンドウのサイズは変更しない前提で進めていきます。

さて、内部データへの変換です。変換エンジンのところで、データの変換を行って、最後に返せばいいかと思ってたんですが、内部データ生成の部分を二重に書くことになってしまいますね・・。実際に描画する際のルーチンをそのまま使いたい気がしたので、ちょっと、構造を変えて、QtlSvgConvertorで、QtlDrawDataを持っておき、直接そこに書き込む動作に変えます。・・・、って自分用のメモなので、記事を読んでる人には何のことやらわからないことが時々出てくると思いますが、気にしないで下されば幸いです・・。で、変えた図はこんな感じ。

10071800.png
やや無理やり気味


で、シーケンス上で渡していたQPaintDeviceの代わりにQtlDataを渡すことにします・・・。ついでにQtlSvgConvEngine側でQtlSvgConvertorが持っているQtlDrawData内のQPaintDeviceを取りだす為にQtlSvgConvertorに関数の追加が必要です。また、それに加えて、QtlSvgConvertorをQtlSvgConvEngine側に渡す必要も出てきますね・・。う〜ん、もうぐちゃぐちゃですね。やっぱり、QtlSvgConvertorとQtlSvgConvEngineは一つにした方が良さげです。今はしませんが・・。

10101200.png
変更後のシーケンス


上記を前提に下記の関数を追加しました。

QtlDrawData *QtlSvgConvertor::getData()QtlSvgConvertor内に保存しているQtlDrawDataを取得する。


さて、かなり無理やり感がありますが、これで一応実現は可能でしょうか・・。


引っ張ってなんですが、つづく。

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

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