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' メソッドを用意しています。行番号が範囲外ならランタイムエラーをスローします。
次回は、モデルとビューを関連付けて、ブックマークを追加するまでをやってみます。