見出し画像

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ボタンが押されたイベントが、どのようにしてディレクトリ情報の取得動作に繋がるか、最後のピースを埋めた形になりました。次回は、ここまで築き上げた機能を応用して、データベース内の文書を集める作業をしてみたいと思います。

この記事が気に入ったらサポートをしてみませんか?