Qt TableView

QtのTableViewの最もシンプルな例を紹介します。

QtTableViewはデータをテーブル上に表示するGUIウィジェットです。

主に次の様な手順で使用します。

  • TableViewをインスタンスし、用意する
  • モデルデータオブジェクトを定義する
  • TableViewのsetModelメソッドでオブジェクトを渡す

TableViewのモデルを作成する

今回は配列や構造体を用意せず、単純に振る舞いを見える様にしたサンプルを作りました。

TableViewにデータを表示するにはモデルが必要になります。

モデルを作成するにはQAbstractTableModelを継承したクラスを定義しTableView::setModel()に渡す必要があります。

#include <QObject>
#include <QAbstractTableModel>

class mydata : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit mydata(QObject *parent = nullptr);
    virtual ~mydata() override;
};

TableViewのTableView::setModel()にセットされたオブジェクトはTableViewから次のメソッドが呼び出される為オーバーライドして定義する必要があります。

必要なメソッド

  • columnCount() 列数を返すメソッド
  • rowCount() 行数を返すメソッド
  • data() 要求データを返すメソッド
  • headerData() ヘッダーを返すメソッド

※今回のサンプルは配列や構造体を使わず振る舞いを知る為の例ですので、実用するにはaddData()等オブジェクト内でデータを管理するプログラムが必要になります。

メソッドを定義する

mydata.h

#include <QObject>
#include <QAbstractTableModel>

class mydata : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit mydata(QObject *parent = nullptr);
    virtual ~mydata() override;


    //列数を返す
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    //行数を返す
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    //データを返す
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    //ヘッダーを返す
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

private:

    // 本来は配列から推測するので必要なし
    int tableColumn = 5;
    int tableRow = 5;

};

※QAbstractTableModelはインターフェイスですので必須メソッドはオーバーライドして定義する事に注意してください。

tableColumntableRowは本来オブジェクトが保有するデータから割り出す値です。

mydata.cpp

#include "mydata.h"

mydata::mydata(QObject *parent): QAbstractTableModel(parent)
{

}

mydata::~mydata()
{

}

int mydata::columnCount(const QModelIndex &parent) const{
    //本来は表示する配列の要素数を返す
    return this->tableColumn;
}

int mydata::rowCount(const QModelIndex &parent) const{
    //本来は表示する配列の要素数を返す
    return this->tableRow;
}

QVariant mydata::headerData(int section, Qt::Orientation orientation, int role) const{
    if(role != Qt::DisplayRole){
        return QVariant();
    }

    // 縦・横のヘッダーを返す
    if(orientation == Qt::Horizontal){
        return QString("%1%2").arg("H").arg(QString::number(section));
    }else{
        return QString("%1%2").arg("V").arg(QString::number(section));
    }
}

QVariant mydata::data(const QModelIndex &index, int role) const{
    if(role != Qt::DisplayRole){
        return QVariant();
    }

    //データを返す
    return QString("Data %1-%2")
            .arg(QString::number(index.column()))
            .arg(QString::number(index.row()));
}

ソースコードの解説

int role について

要求されたアイテムの属性をロールといいます。 今回表示するアイテムはテキストですので、Qt::DisplayRole以外の場合はQVariant()を返す様にしています。

Qt Namespace | Qt Core 5.14.0 #ItemDataRole-enum


headerDataについて

このメソッドは要求されたヘッダーのデータを返します。

引数 説明
int section 要求位置が渡されます
Qt::Orientation orientation 要求されている方向が渡されます
int role ロール

ヘッダーには横方向と縦方向の2つがあります。 エクセルやスプレッドシートでのA~Zが横方向の連番のが縦方向です。

まず方向を判定する為に次の条件分岐で振り分けます。

    if(orientation == Qt::Horizontal){

    }else{

    }

Qtで方向を示すネームスペースは次の2つです。

Name 方向
Qt::Horizontal 横方向 0x1
Qt::Vertical 縦方向 0x2

orientationとsectionから要求位置を把握する事ができる様になりますので、その要求に応じてヘッダーを返します。


data について

このメソッドは要求されたテーブルのデータを返します。

引数 説明
const QModelIndex &index モデルデータのインデックス
int role ロール

QModelIndexはモデルデータ内のデータを見つける為に使用されます。

要求はQModelIndexのQModelIndex::column()QModelIndex::row()から取得できます。

コメント

このブログの人気の投稿

Qt ウィンドウのあれこれ

Qt setWindowFlagsについて

Qt レイアウト 余白の処理