今天测试Qt程序的时候碰到了2个小问题:
1. 如何在TreeView中进行排序。
标准做法当然是使用QSortFilterProxyModel,起先我自定义的Model类是从QAbstractProxyModel派生出来的,做了一些定制的修改,当我想排序的时候,我把基类改成QSortFilterProxyModel,发现有好些不兼容的地方。把我自定义的Proxy Model的函数全部屏蔽掉以后一切正常,因此,如果你需要自定义的Proxy Model,从QSortFilterProxyModel派生吧,让你一开始就能避免很多潜在问题。后面我还得看看我的哪些函数出了错误。
另外,View缺省是不排序的,要让你可以在点击某个column的header时进行排序,需要设置sortingEnabled这个属性。
2.改变选中的item后,只有我focus的那一列对选中状态有更新,对于未涉及到的column,需要刷新或者通过其他方式重绘的时候才能更新。
因为我做了好几处地方的修改,有派生的View,有派生的Model,还有Proxy Model,因此一时之间也不知道到底是哪里出了错,修改过下面几个地方:
- Model insert column的时候通知proxy model,proxy model将此事件通知view,我原先以为view不知道我column的信息。
- 设置了新的proxy model后调用reset,以为这样column的信息会被刷新。我以为view缺省认为我的proxy model只有一个column。
- 修改allColumnsShowFocus,这样确实可以解决一个column更新的问题,但是当你一次选中多行(row)的时候,问题依然存在。
- 还做了一些其他地方的修改,我自己都不记得有哪些了。
其实问题在于,我派生的QTreeView并重载了selectionChanged方法,结果我当时写这个方法的时候只是为了测试一下是不是会被调用,留着看看后面有没有地方需要被用到,结果忘记调用基类的方法QTreeView::selectionChanged。
哎,真是破费周折啊!看来,不管是写公司的code,还是自己处于学习的目的写一些code,都要一样的严谨、写一段code就把一段code理解清楚。