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はインターフェイスですので必須メソッドはオーバーライドして定義する事に注意してください。
※tableColumn
やtableRow
は本来オブジェクトが保有するデータから割り出す値です。
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()
から取得できます。
コメント
コメントを投稿