1. 程式人生 > >Qt Model/View理解(二)---構造model

Qt Model/View理解(二)---構造model

資料是一個集合,顯示也是一個集合。例如一篇《西遊記》的文章,所有的文字就是資料集合,展示方式就是顯示的集合,可以以書本的形式,也可以以電紙書的形式,更可以用視訊的方式展現。

下面是將一個二維陣列中的資料顯示到TableView控制元件中。

1.宣告一個model類,繼承於QAbstractTableModel

#define ROW  3
#define COL  2

class TableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    TableModel(QObject *parent = 0);
    ~TableModel();
    //QAbstractTableModel 中3個必須重新實現的虛擬函式
    int	rowCount(const QModelIndex & parent = QModelIndex()) const;
    int	columnCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

private:
    int num[ROW][COL];
    int nn;
};

2.方法實現

TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent)
{
    //二維數初始化,從100開始
    nn = 100;
    for(int i=0;i<ROW;++i){
        for(int j=0;j<COL;++j){
            num[i][j] = nn;
            ++nn;
        }
    }
}

TableModel::~TableModel()
{
}

//體現model的行數,這裡有3行
int	TableModel::rowCount(const QModelIndex & parent) const
{
    return ROW;
}

//體現model的列數,這裡有2列
int	TableModel::columnCount(const QModelIndex & parent) const
{
    return COL;
}

//體現model中顯示的資料,這裡只是num中每一個成員值。
QVariant TableModel::data(const QModelIndex & index, int role) const
{
    if (Qt::DisplayRole == role)
    {
        return num[index.row()][index.column()];//返回num二維陣列中的值
    }
    return QVariant::Invalid;
}

3.將model與QTableView關聯起來。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(300,200);

    TableModel *model = new TableModel();

    QTableView *tableview = new QTableView(this);

    tableview->setModel(model);

    tableview->setGeometry(5,5,280,180);
}

4.顯示效果,3行2列


目前的實現都是從定義好的model中取出資料,放在不同的顯示控制元件中,相當於只讀,沒有對資料部分做任何修改。下一節將以此篇為基礎,介紹如何對資料部分進行操作。