見出し画像

Qt5再入門: QStandardItem

QStandardItemは、Qtが採用しているモデル/ビューアーキテクチャで、QStandardItemModelで利用できるデータ、情報単位です。QStandardItemModelはリストモデル(一次元データ)、テーブルモデル(二次元モデル)、ツリーモデル(階層構造)のいずれにも対応できます。

スクリーンショット 2021-08-26 7.49.55

テキストの他にアイコンやチェックボックスを格納でき、フォントや背景を変更したり、ドラッグ&ドロップができたりなど、レディメイドでも非常に多機能ですが、サブクラス化しても利用できます。

モデルデータとしてすぐ利用できるこのQStandardItemは、カスタムモデルを作る工数を大幅に削減してくれるので、ついつい頼りにしてしまいます。今回は、このQStandardItemを媒介して、ブックマークデータ(クラス)を作ります。以下は、そのヘッダーファイルです。

// bookmark.h
#ifndef BOOKMARK_H
#define BOOKMARK_H

#include <QString>
#include <QList>
#include <QStandardItem>

class Bookmark
{
 QString label_;
 QString server_;
 QString path_;

public:
 static const int COL_LABEL;
 static const int COL_SERVER;
 static const int COL_PATH;

 Bookmark();
 Bookmark(const QList<QStandardItem*> &list);

 QString label() const { return label_; }
 QString server() const { return server_; }
 QString path() const { return path_; }
};

#endif // BOOKMARK_H

ブックマークデータは、ラベル、サーバー名、パス名で構成されます。ラベルは単にラベルとして、サーバー名とパス名は、NotesクライアントまたはDominoサーバにアクセスするPathNetデータとして使用します。

// bookmark.cpp
#include "bookmark.h"

const int Bookmark::COL_LABEL = 0;
const int Bookmark::COL_SERVER = 1;
const int Bookmark::COL_PATH = 2;

Bookmark::Bookmark()
 : label_()
 , server_()
 , path_()
{}

Bookmark::Bookmark(const QList<QStandardItem*> &list)
 : label_(list.at(COL_LABEL)->data(Qt::DisplayRole).toString())
 , server_(list.at(COL_SERVER)->data(Qt::DisplayRole).toString())
 , path_(list.at(COL_PATH)->data(Qt::DisplayRole).toString())
{}

ブックマークは1行で1データですが、テーブル上はQStandardItem3つの横並びとして存在します。1行分のデータ(QList<QStandardItem*>)をコンストラクタに渡せば、1列目をラベル、2列目をサーバー名、3列目をパスとしてパースして保持してくれます。

Qt::DisplayRoleは、enum Qt::ItemDataRoleの1つで、表示に使用するデータを指し示すロール(役割)で、QString型(文字列)になります。編集時に使用する値用のロールとして Qt::EditRole というのもありますが、これも文字列です。文字列以外の値を持たせたい時は、Qt::UserRoleを通してQVariant型としてデータを渡します。今回、ラベル、サーバー名、パス名の3つのフィールドはすべて文字列なので、ここではDisplayRoleを使っています。

次回はこれを利用するQStandardItemModelについて話します。

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