Qt的model中一裤衩函数的总结

写了两年Qt程序,翻看这篇博文,菜鸡的不忍直视。如果你点开了,时间又不是很充裕的话,别看了。

最近要用Qt做一个MVC的项目。一打开model,我擦晕了。满眼的函数,完全不知道怎么用。和以往猜一猜加随便看两眼文档就开始大刀阔斧的使用Qt不同。啃了两天,终于肯掉了肉,肯出了骨头。闲话少说,毕竟上班时间写博客也是划水的一种。


Qt的model中包含了很多名字看起来很像的函数,比如下面这组:

bool    insertRow(int row, const QModelIndex & parent = QModelIndex())
bool    insertRows(int row, int count, const QModelIndex & parent = QModelIndex())
void    beginInsertRows(const QModelIndex & parent, int first, int last)
void    endInsertRows()
void    rowsAboutToBeInserted(const QModelIndex & parent, int start, int end)
void    rowsInserted(const QModelIndex & parent, int start, int end)

整理了很多函数以后,发现可以这样归纳。设操作为Opera,方向为Orientation.那么Qt这些函数可以归纳为如下的几种

                  bool    operaOrientation
QVariant  bool    operaOrientations
                  void    beginOperaOrientations
                  void    endOperaOrientations
                  void    OrientationsAboutToBeOperaed
                  void    OrientationsOperaed

其中Opera包括插入insert,删除remove,移动move,重置reset。Orientation包括行row和列colum。

比如Opera为insert,Orientation为row ,operaOrientation就是insertRow。

这么多函数,他们到底怎么用的呢?在model中的数据有改变的时候,这些函数到底起什么作用?如我一一道来。

首先说operaOrientations,operaOrientations是个虚函数,我们在重定义的operaOrientations函数中,对model的数据进行opera。比如删除行,那么就重新实现removeColuns就可以了。

如过只是实现了operaOrientations就完成了,那么其他函数存在的意义是什么呢?做为有求知欲的我们肯定要一探究竟的。

其中operaOrientation是operaOrientations的一种包装,也就是说operaOrientation最后还是调用了operaOrientations完成。这也是为什么opera多个要重实现operaOrientations,opera一个却不用重实现operaOrientation的原因。

现在提出两个问题:view操作数据时候,model却把数据给改变了怎么办?model的数据改变了,View不知道怎么办?说白了就是model的数据和View是如何同步的?

这个时候剩下的4个函数就起作用了。

我们在operaOrientations中真正的opera之前必须使用beginOperaOrientations,此时,model会发射OrientationsAboutToBeOperaed信号,opera之后还要endOperaOrientations,此时model会发射OrientationsOperaed信号。


研究了两天,发现这样使用基本可以了,但是还有一个遗留的疑问。

在opera中为什么没有编辑。setItemData函数中为什么不使用beginSetOrientations,endSetOrientations并发射信号呢?

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页