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

バックアップの処理クラスを考える [Qt]

先日、「mainwindow.ui」に以前追加したslotが残っている件を気にしていましたが、それを削除できないかと思っていたところ、できました。

Objectペインの「MainWindowClass」を右クリックし、「change signals/slots」を選択します。

10122800.png

こっちにはありました


「Slots」の欄に「addButtonClicked()」が残っていたので、これを選択して「-」ボタンを押して削除します。

10122801.png

ここに残ってます


結果を保存して、「mainwindow.ui」をテキストエディタで見たところ、該当の箇所の記述が消えていました。

10122802.png

消えた!


*

以上、すっきりしたところで、実装を進めようと思いますが、進める前にクラス構成を考えたいと思います。今まで、MainWindowクラスに色々貼り付けていましたが、ここは単なるUIとして、バックアップ制御を受け持つクラスを別に用意したいと思います。クラス図を書くとこんな感じでしょうか・・。

10122803.png

描くほどでもないですが・・


アプリケーション自体はMainWindowクラス主体で動くので、そのエンジンとなる「BackupControl」と言うクラスを作成します。ベースクラスは無しとします。

MainWindowクラスとこのクラス(BackupControl)の間でBackupControlクラス側に必要そうなメソッドは下記のような感じでしょうか。

addSourceDir()バックアップ元ディレクトリの追加
delSourceDir()バックアップ元ディレクトリの削除
backup()バックアップ開始
setDestinationDir()バックアップ先ディレクトリの設定
getSourceDirs()設定されているバックアップ元ディレクトリの取得
getDiestinationDir()設定されているバックアップ先ディレクトリの取得
stop()バックアップの停止


最後のメソッドで思いつきましたが、そう言えば、バックアップ動作の中止のボタンが必要ですね・・。

また、経過出力のためにsignalを出してもらう必要がありそうです。signalでいいんですかね・・。

startCopyFile()1ファイルコピー開始のsignal(コピー元)
finishCopyFile()1ファイルコピー終了のsignal(コピー元)
startCopy()コピー処理開始のsignal
finishCopy()コピー処理終了のsignal
stopCopy()コピー処理停止のsignal


ここまで書いて気付きましたが、これって、バックアップ処理は並列処理で行わないと途中で停止ができない気がしますね・・。Qtのスレッドの仕組みを見なければ・・。


つづく。




タイトルバーの文字化けを直す [Qt]

さて、ファイル選択ダイアログのタイトルバーの文字が化けてしまう件ですが、まずは、先日調べた以下のフレーズを試してみようと思います。今のところ翻訳データは無いので、main()に下記を追加してみます。

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));


ソースはこんな感じです。

#include <QtGui/QApplication>
#include "mainwindow.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

    w.show();
    return a.exec();
}
これでうまくいくといいですけどねぇ・・


これで実行してみます。・・・コンパイルエラーが出ました・・。

ヘッダをインクルードするのを忘れてました。QTextCodecのページを見たところ、「#include <QTextCodec>」だとのこと。

追加して実行したところ・・。

10122100.png
文字化けが直りました



正常に表示できました。と言うことで、簡単ですが、今回はこれで。







ディレクトリ選択ダイアログの表示 [Qt]

ウィンドウタイトルを変えるだけで、えらいとまどってしまいましたが、気を取り直して、とりあえず、各ボタンのスロットを作っていきます。まずは、関数の枠から・・。

ボタンを右クリックし、「Go to slot...」を実行して行きます。

10121400.png
追加は容易になりました


残り三つのボタンに対応するslotを作成して、ヘッダファイルを見てみたら、インデントがおかしいです・・。カーソル位置がおかしかったのか・・?

10121401.png
これは手で直します


ソースを見る限り、追加したslotは「private slots:」ラベルの下に追加されていくみたいですね。後から追加した方が上の方に追加されています。

ちなみに、関数の枠もちゃんとできています。

10121402.png
こっちは作成した順に追加されています


ログを仕込んで、実行したところ、全てのボタンが反応しました。

10121403.png
ログで確認


では、とりあえずQFileDIalogを「追加」ボタンから呼び出してみます。簡単に使いたいならstatic関数を呼べばいいとのこと。下記の関数が用意されています。

QFileDialog::getExistingDirectory 存在するディレクトリの指定に使用。
QFileDialog::getOpenFileName 存在するファイルを一つだけ指定するのに使用。
QFileDialog::getOpenFileNames 存在する一つ以上のファイルを指定するのに使用。
QFileDialog::getSaveFileName 一つのファイル名を指定するのに使用。ファイルは存在していても無くてもどちらでもいい。


コピー元の追加は複数指定できた方が便利ですし、できたらディレクトリだけでなくファイル名も指定できると自由度が増す気がします。と言うことで、QFileDialog::getOpenFileNamesを使ってみたいのですが、これがディレクトリを指定できるのかどうかが不明です。まあ、試してみましょう。

引数は下記のものが用意されています。

QWidget *parent = 0親ウィジェット。これを設定するとモーダルダイアログになるとのこと。親ウィジェットの中央に表示されるとのこと。thisでいいと思います。
const QString & caption = QString()ダイアログのタイトルバーに表示される文字列ですね。設定しない場合はデフォルトの文字列が使われるとのこと。
const QString & dir = QString()ワークディレクトリ。ファイル名を含む場合は、そのファイルが選択された状態になる。
const QString & filter = QString()フィルター。複数のフィルターを指定する時は、「;;」で区切るとのこと。書式が不明・・。
QString * selectedFilter = 0選択されているフィルター。
Options options = 0


とりあえず、このように実装してみました。

void MainWindow::on_addButton_clicked()
{
    qDebug() << "on_addButton_clicked()";

    QStringList *srcList = new QStringList();

    *srcList = QFileDialog::getOpenFileNames(this, tr("バックアップ元の選択"));
    qDebug() << *srcList;

    delete srcList;
}
うまくいくか?


実行して、ファイルダイアログを起動したところ、このような画面に・・。タイトルが化けてます・・。

10121404.png
タイトル部分が文字化け・・


ディレクトリを選択して、「開く」を押したところ、そのディレクトリ内に入ってしまいました・・。ファイルを選択して「開く」を押したらうまくいった様です・・。このダイアログではディレクトリは選択できませんね・・。

と言うことで、QFileDialog::getOpenFileNamesでは、ディレクトリの選択は出来ませんね・・。

仕方がないので、QFileDialog::getExistingDirectoryを利用します。

void MainWindow::on_addButton_clicked()
{
    qDebug() << "on_addButton_clicked()";

    QStringList *srcDir = new QStringList();

    *srcList = QFileDialog::getExistingDirectory(this, tr("バックアップ元の選択"));
    qDebug() << *srcDir;

    delete srcDir;
}
うまくいくか?


これで、1つづつですが、ディレクトリの選択は出来るようになりました。が、相変わらず、キャプションの文字化けが残っています・・。

10121405.png
文字化けを直したい


次回はこれを調べましょう。つづく。


Qt Designer上での各部品のプロパティの変更 [Qt]

前回の記事で、Qt Designer上でのslotの追加の仕方が概ねわかりました。slotの作成に各部品の名前が関わってくることが判明したので、まず、各部品に名前を付けることにしました。つけた名前は、下記の通りです。

部品名オブジェクト概要
1バックアップ対象リスト表示領域srcListバックアップ対象のディレクトリを列挙する。
2追加ボタンaddButtonバックアップ対象ディレクトリの追加のためのボタン。
3削除ボタンdelButtonバックアップ対象ディレクトリの削除のためのボタン。
4バックアップボタンstartButtonバックアップ開始のボタン。
5バックアップ先表示領域destDirバックアップ先のディレクトリを表示。
6選択ボタンdestButtonバックアップ先のディレクトリを選択するためのボタン。
7進捗状況表示領域progressView進捗状況を表示する。


各部品の対応は下記の通りです。

10120700.png
名前を付けるのは難しいですね


そう言えば、ウィンドウのタイトルも変えておきました。一応、英字にしときましたが・・。

とさらっと書きましたが、変え方がなかなかわかりませんでした・・。Object Inspector(右上)で「MainWindowClass」を選択して、Property Editor(右下と言うか、右中央?)で「windowTitle」と言うプロパティを変更しようとしましたが、編集できる状態になりません・・・。説明を見る限り、ここのValueの欄をクリックすれば、変更できそうな感じなのですが、いくらクリックしても編集状態に変わりませんでした・・。

10120701.png
かなり、いらいら状態・・


調べても良くわからないので、Qt Creator上で変更するのはあきらめて、同時にインストールされていたQt Designerを別途起動して変更を試みたところ、あっさりできました・・・・。

10120702.png
ここまで来るのに苦労しました・・。


う~ん、Qt Creator に組み込まれているものと、同時にインストールされた Qt Desginerではバージョンが違うんですかね・・。何となく、最新のものでは大丈夫で、今のところNetWalker上だけの症状の様な気もしますが、ご参考まで。


つづく。





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

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