見出し画像

Qt5再入門: QStandardItemModel

QStandardItemModelは、QStandardItemを扱うQtのモデルで、本記事では、前回使用した「ブックマーク」データを生成するため、QStandardItemModelのサブクラス「BookmarkModel」を作成します。

今回は「テーブルモデル」としてBookmarkModelの使用を前提とするので、1セル=1 QStandardItemになります。「1行分」=「1ブックマーク」として使用し、ブックマークにはラベル、サーバー名、パス名の3つの文字列データが必要になるので、「1ブックマーク」=「3つ分のQStandardItem」で構成します。

まずヘッダーファイルです。

// bookmarkmodel.h
#ifndef BOOKMARKMODEL_H
#define BOOKMARKMODEL_H

#include <QStandardItemModel>
#include <QList>
#include <QStandardItem>

class Bookmark;

class BookmarkModel
   : public QStandardItemModel
{
 Q_OBJECT
public:
 explicit BookmarkModel(QObject *parent = nullptr);

 QList<QStandardItem*> rowItems(int row);

 Bookmark bookmark(int row);
};

#endif // BOOKMARKMODEL_H

ソースコードは以下のようになります。

// bookmarkmodel.cpp
#include "bookmarkmodel.h"
#include "bookmark.h"
#include <stdexcept>

BookmarkModel::BookmarkModel(QObject *parent)
 : QStandardItemModel(parent)
{
 setHorizontalHeaderLabels(
       QStringList()
       << tr("Label")
       << tr("Server")
       << tr("Path")
       );
}

QList<QStandardItem*> BookmarkModel::rowItems(int row) {
 if (row < 0 || row >= rowCount()) {
   throw std::runtime_error("The specified row is missing.");
 }
 return QList<QStandardItem*>()
     << item(row, Bookmark::COL_LABEL)
     << item(row, Bookmark::COL_SERVER)
     << item(row, Bookmark::COL_PATH);
}

Bookmark BookmarkModel::bookmark(int row) {
 return Bookmark(rowItems(row));
}

コンストラクタでは、X軸のヘッダーラベルを設定しています(setHorizontalHeaderLabels)。ヘッダーラベルは、ラベル、サーバー名、パス名の3つを格納したQStringListで生成します。なお、コード中の'tr' 関数は、翻訳候補文字列を指定する、QObjectに実装されているメソッドです(Qtの翻訳システムは別の記事で取り上げる予定です)。

ブックマークは1行3つのQStandardItemで1つなので、行番号を渡せば、1ブックマークが生成できるように 'rowItems' メソッドを設け、さらにそのままブックマークとして返せるように 'bookmark' メソッドを用意しています。行番号が範囲外ならランタイムエラーをスローします。

次回は、モデルとビューを関連付けて、ブックマークを追加するまでをやってみます。

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