Qt5再入門: ウィジェットを動的に追加する(その3)
前回の記事では、FilePageクラスにExpanderインナークラスを定義して、Expandボタンに連動した動作を定義しようというところで終わりました。
Expandボタンのクリック動作は、シグナル/スロット機構によってFilePage::expandスロット関数を呼び出すことにしています。
// FilePageコンストラクタ内
// Expandボタンの生成
auto pButton = new QPushButton(tr("&Expand"), this);
// Expandボタンのクリックをexpandスロット関数に紐付け
connect(
pButton, &QPushButton::clicked,
this, &FilePage::expand
);
expandスロット関数
// filepage.cpp内より抜粋
void FilePage::expand() {
// サブモデルが未定義なら生成する
if (pSubModel_ == nullptr) {
pSubModel_ = new QStandardItemModel(this);
}
// サブビューが未定義なら生成し、スプリッターに加える
if (pSubView_ == nullptr) {
pSubView_ = new QTableView(this);
pSubView_->setModel(pSubModel_);
addToSplitter(pSubView_);
}
// サブモデル内のデータをクリアする
pSubModel_->clear();
try {
// データベース/ディレクトリを開く
auto dbPtr = nxpp::Db::open(path_, server_);
// エキスパンダーのポインタを作成
QScopedPointer<Expander> expander;
// 開いたファイルに応じてエキスパンダーを設定
if (dbPtr->isDirectory()) {
expander.reset(new DirectoryExpander());
} else {
expander.reset(new DatabaseExpander());
}
// エキスパンダーにモデル用のヘッダーを設定する
expander->setHeader(pSubModel_);
// エキスパンダーを実行
(*expander)(this, dbPtr);
// サブビューの列幅を調整する
pSubView_->resizeColumnsToContents();
// ステータスを表示
emit showStatus(tr("Expanded FilePage"));
// コンソールに表示
emit consoleLog(
tr("Expanded file (%1:%2)")
.arg(fromLmbcsQ(path_))
.arg(fromLmbcsQ(server_))
);
}
// Notesステータスがスローされたらそのエラーメッセージに変換して表示
catch (nxpp::Status &status) {
emit consoleLog(nxpp::qt::fromStatus(status.error()));
}
// それ以外の例外ならそのメッセージを表示
catch (std::exception &ex) {
std::string what(ex.what());
emit consoleLog(QString::fromStdString(what));
}
}
サブモデル(pSubModel_)とサブビュー(pSubView_)が未定義の時、画面上ではサブビューが未表示であると判断し、サブモデルとサブビューを生成し、両者を連動させ、サブビューをスプリッターに追加しています。
次に、サブモデル内のデータはいったんクリアしておきます。
モデル/ビューの準備ができたら、サブビューに展開するデータを取得しに行きます。データベース/ディレクトリを開き、データベースか、ディレクトリかを確認して生成するExpanderを、DatabaseExpanderにするか、DirectoryExpanderにするか選択します。
Expanderを生成したら、エキスパンダーから必要なテーブルヘッダー情報をサブモデルに伝え、Expanderを実行します。ここで、DirectoryExpanderであればこちらの記事で紹介しているように、nxpp::Search関数オブジェクトを使ったディレクトリ検索が実行され、取得された内容がサブモデルに記録されます。
テーブルの展開が終わったら、データの内容に応じて列幅を調整(resizeColumnsToContents)して終了します。
まとめ
今回の記事では、ディレクトリページにおいてExpandボタンが押されたイベントが、どのようにしてディレクトリ情報の取得動作に繋がるか、最後のピースを埋めた形になりました。次回は、ここまで築き上げた機能を応用して、データベース内の文書を集める作業をしてみたいと思います。