一些ui部件,是要展示数据的(比如label上的数据、table里的数据),而这些数据 往往是外部动态的(比如来自于数据库)
也就是, ui部件 如何与 数据,相关联?
有两种方式:
model - view
编程。标准部件standard widget
,是使用的 第一种方式,即ui部件内部 会另存一份数据。
view widget,是使用的 第二种方式,ui部件内部并没有数据 通过(指针)链接 外部数据。
标准widget 与 view widget 同一个ui部件,对应2种实现方式
像button、lineedit这些部件,里面存储的数据 比较单一 只有1个
而像:table二维表格、list一维列表、tree可展开列表,这些部件 他里面存储的数据 是很多的!!
比如table,他二维表格 共n*m个项,都要存储数据。
表示,存放表格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里,需要提供哪些信息呢??
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();