티스토리 뷰
QTableView 클래스는 MVC 형태로 모델과 뷰를 분리하여 개발자는 모델을 제공하고 뷰는 QTableView 클래스에서 책임지는 방식이다. QWidget> QFrame> QAbstractScrollArea의 계층 구조로 상속받는다.
참조 링크 : https://doc.qt.io/qt-5/qtableview.html
QTableView tableView;
MyModel myModel;
tableView.setModel(&myModel);
tableView.show();
프로그램에서 모델을 통해서 표를 출력하는 부분은 위의 예제처럼 단순하다. setModel로 사용자의 모델 클래스 오브젝트를 제공하면 된다. 물론 사용자 모델 클래스에서는 미리 약속된 형태로 뷰의 요청에 필요한 정보를 제공해야 한다.
#include <QAbstractTableModel>
class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit MyModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(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;
};
위의 코드는 사용자 모델 클래스의 정의 부분으로 QAbstractTableModel 클래스를 상속하여 필요한 함수를 오버라이드하여 기술하면 된다. 예를 들어 뷰에서 행과 열을 크기를 rowCount(), columnCount()로 요청하면 해당 함수를 재정의하여 사용자 모델 클래스에서 해당하는 크기를 응답하면 된다. 마찬가지로 뷰에서는 표시할 자료나 양식을 data()로 요청하므로 이 함수를 재정의하여 필요한 내용을 응답하면 된다.
int MyModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 3;
}
int MyModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 3;
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
int col = index.column();
switch (role) {
case Qt::DisplayRole:
return QString("R%1, C%2").arg(row).arg(col);
case Qt::BackgroundRole:
if (row == 1) return QBrush(Qt::red);
break;
case Qt::TextAlignmentRole:
if (col == 1) return int(Qt::AlignRight | Qt::AlignVCenter);
break;
}
return QVariant();
}
QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
if (section == 0) {
return QString("Name");
} else if (section == 1) {
return QString("Phone");
} else if (section == 2) {
return QString("Sex");
}
}
return QVariant();
}
위의 예제는 편집 기능이 없는 읽기 전용 형태의 단순한 형태이지만 편집을 포함한 다양한 확장도 가능하다. 재정의 가능한 함수들은 QAbstractItemModel 클래스에서 확인할 수 있다.
virtual bool canDropMimeData(QMimeData *data, Qt::DropAction action, int row, int column, QModelIndex &parent)
virtual bool canFetchMore(QModelIndex &parent)
virtual bool clearItemData(QModelIndex &index)
virtual int columnCount(QModelIndex &parent = QModelIndex())
virtual QVariant data(QModelIndex &index, int role = Qt::DisplayRole)
virtual bool dropMimeData(QMimeData *data, Qt::DropAction action, int row, int column, QModelIndex &parent)
virtual void fetchMore(QModelIndex &parent)
virtual Qt::ItemFlags flags(QModelIndex &index)
virtual bool hasChildren(QModelIndex &parent = QModelIndex())
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole)
virtual QModelIndex index(int row, int column, QModelIndex &parent = QModelIndex())
virtual bool insertColumns(int column, int count, QModelIndex &parent = QModelIndex())
virtual bool insertRows(int row, int count, QModelIndex &parent = QModelIndex())
virtual QMap<int, QVariant> itemData(QModelIndex &index)
virtual bool moveColumns(QModelIndex &srcParent, int sreColumn, int count, QModelIndex &destParent, int destChild)
virtual bool moveRows(QModelIndex &srcParent, int srcRow, int count, QModelIndex &destParent, int destChild)
virtual bool removeColumns(int column, int count, QModelIndex &parent = QModelIndex())
virtual bool removeRows(int row, int count, QModelIndex &parent = QModelIndex())
virtual int rowCount(QModelIndex &parent = QModelIndex())
virtual bool setData(QModelIndex &index, QVariant &value, int role = Qt::EditRole)
virtual bool setHeaderData(int section, Qt::Orientation orientation, QVariant &value, int role = Qt::EditRole)
virtual bool setItemData(QModelIndex &index, QMap<int, QVariant> &roles)
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)
virtual QSize span(QModelIndex &index)
virtual Qt::DropActions supportedDragActions()
virtual Qt::DropActions supportedDropActions()
virtual void revert()
virtual bool submit()
'C | C++' 카테고리의 다른 글
QGraphicsScene 클래스(QT C++) (0) | 2024.03.13 |
---|---|
QGraphicsView 클래스(QT C++) (0) | 2024.03.13 |
QTableWidget 클래스(QT C++) (0) | 2024.03.08 |
QTextEdit 클래스(QT C++) (0) | 2024.03.07 |
C++ 정규식(std::regex) 사용하기 (0) | 2024.03.07 |