Model/View模型视图

catalog

base

一些ui部件,是要展示数据的(比如label上的数据、table里的数据),而这些数据 往往是外部动态的(比如来自于数据库)

也就是, ui部件 如何与 数据,相关联?
有两种方式:

  • ui部件,内部再存储一份数据,即自己本身自带数据,这是很直观的想法
    即,ui内部存储的数据 与 外部引用的数据,是两个东西。我们程序员需要自己 去确保,这两份数据是保证高度相同的。
    这也说明,这种方式的 耦合性 很高。
    但是,在大型项目里,这会导致数据无法同步的问题
  • ui部件,内部不会存储数据。ui部件 通过标准化的接口 来访问 外部数据 数据只有1份!!
    这称为: model - view编程。

标准部件standard widget,是使用的 第一种方式,即ui部件内部 会另存一份数据。
Model/View模型视图


view widget,是使用的 第二种方式,ui部件内部并没有数据 通过(指针)链接 外部数据。
Model/View模型视图

标准widget 与 view widget 同一个ui部件,对应2种实现方式
Model/View模型视图

像button、lineedit这些部件,里面存储的数据 比较单一 只有1个
而像:table二维表格、list一维列表、tree可展开列表,这些部件 他里面存储的数据 是很多的!!
比如table,他二维表格 共n*m个项,都要存储数据。

example

Table

TableView

表示,存放表格table 的view

QTableView tableView;
tableView.setGeometry(0, 0, 1000, 1000);
tableView.show();

你这样,他是 完全空白的,连表格线都没有!!!
因为,view的row/column的个数、cell的内容,完全是由model来决定的。
view没有model,自然就是0行 0列,什么都没有。

view 必须和 model,链接一起来使用

MyTableModel model;
tableView.setModel( &model );

tableView.show();

view的setModel()函数,便是将 view和model,链接起来。

既然是table,那么MyTableModel里,需要提供哪些信息呢??

  • model里,需要提供: row个数、column个数
  • model里,需要提供,这row*column个cell的 数据!!

TableModel

class MyTabelModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    MyTabelModel(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;
};

我们的tableModel,必须实现父类的 这3个纯虚函数。
row个数、column个数、以及 这个row*column个cell的内容

int rowCount(...){ return 2; }
int columnCount(...){ return 3; }
QVarient data(const QModelIndex &index, int role){
       return QString("Row%1, Column%2")
                   .arg(index.row() + 1)
                   .arg(index.column() +1);
}

示例:

QTableView tableView;

MyTableModel myModel();
tableView.setModel( &myModel );

tableView.show();

Model/View模型视图

上一篇:codeforces 拼手速题2


下一篇:快速滑动时 `cellForRow` 的调用次数