功能:在线列表,列表的每一项的样式是鼠标滑过呈现一些功能按钮和图片。
需要改造的问题:在线列表加载特别卡
需要改造的问题:在线列表加载特别卡
原来的实现方式:是在QTableWidget嵌入一个QWidget,这个QWidget里面添加了4个按钮和3个QLable,呵呵 想想这个QWidget也是蛮拼的是吧。哈哈。。
然后在每一次服务器发过来列表内容的时候,这时候发现一个不好的点,服务器怎么可以每次都是返回全部的列表内容,虽然现在的带宽都是很大的,并且就算有一万人总量也就一m左右。但是可以有更好的方式为什么不用呢?更好的方法应该是服务器返回的增减量,然后返回只是部分数据。继续说在线列表的控件。每次拿到服务器返回的人员名单时与客户端本地内存中的人员列表做一个取舍找出改变的列表然后只加载改变的,当然了第一次是需要全部加载的。
这样做的优点:1.毋庸置疑,这样做最大的好处就是简单。鼠标划过事件,控件的显隐,等等这些处理处理起来很方便。
2. 样式好处理。因为是在widget上处理,所以样式处理起来很方便。
这样处理的不好之处:当数据量小的时候并没有缺点,但是当数据量一旦大了之后缺点就显示出来了。那就是一个字 慢。而且随着数据越大越难。这里面的道理就是你要构造一堆控件放到里面,这是需要时间和内存的啊。
这个方法是前人写的,我的重构方法在下面
重构方法:原理,用QTableView替代原来的QTableWidget,数据的加载放到QAbstractListModel,控件的显示放到QStyleItemDelegate中控制。这时候需要显示的头像实在QStyleItemDelegate中的paint事件中画出来的,然后我将所有的按钮事件放到了右键菜单中,不过也可以在paint事件中画按钮,处理事件,效果和按钮差不多的。
结果:用原有的QTableWidget的方法,加载600条数据时候花费时间是4-6s,而用QTableView时所花费时间为4-6ms
相差就是在1千倍左右,并且我相信,随着数据量大到上万条时这种差距还会再增大的。
总结:对于数据量小的时候 用什么控件都是可以的。但是数据量一旦大了,建议还是乖乖的用QTableView吧。