Model/View模型视图
作者:互联网
catalog
base
一些ui部件,是要展示数据的(比如label上的数据、table里的数据),而这些数据 往往是外部动态的(比如来自于数据库)
也就是, ui部件 如何与 数据,相关联?
有两种方式:
- ui部件,内部再存储一份数据,即自己本身自带数据,这是很直观的想法
即,ui内部存储的数据 与 外部引用的数据,是两个东西。我们程序员需要自己 去确保,这两份数据是保证高度相同的。
这也说明,这种方式的 耦合性 很高。
但是,在大型项目里,这会导致数据无法同步的问题 - ui部件,内部不会存储数据。ui部件 通过标准化的接口 来访问 外部数据 数据只有1份!!
这称为:model - view
编程。
标准部件standard widget
,是使用的 第一种方式,即ui部件内部 会另存一份数据。
view widget,是使用的 第二种方式,ui部件内部并没有数据 通过(指针)链接 外部数据。
标准widget 与 view widget 同一个ui部件,对应2种实现方式
像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();
标签:tableView,部件,视图,ui,Model,View,数据,model,view 来源: https://blog.csdn.net/weixin_42712593/article/details/119222109