使用qt6.2.3开发列表,发现在删除行的时候,会出现无响应,CPU飙升,如下图所示
经过排查,最终定位为QAbstractItemModelPrivate::rowsRemoved方法,如下图所示
当前persistent_moved的大小为table的(row * column)
persistent_moved是在QAbstractItemModelPrivate::rowsAboutToBeRemoved里由persistent.indexes决定的,如下图所示
通过抓取窗体windows消息,发现是由WM_GETOBJECT导致persistent.indexes飙升,参考https://learn.microsoft.com/zh-cn/windows/win32/winauto/wm-ge...,UI自动化程序获取到了窗体句柄,QT处理该消息,进而持久化index
原因
有自动化程序调用了如下代码(python):
import uiautomation as ui
MainWin = ui.WindowControl(searchDepth=1, ClassName='TaskManagerWindow')
DataGrid = MainWin.DataGridControl(searchDepth=5, ClassName='TmScrollViewer')
TaskList = DataGrid.GetChildren()
解决方法
- 重载QMainWindow的nativeevent方法,拦截WM_GETOBJECT消息即可
- 不使用endremoverows,删除也使用beginresetmodel()和endresetmodel()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。