1

使用qt6.2.3开发列表,发现在删除行的时候,会出现无响应,CPU飙升,如下图所示

image.png

经过排查,最终定位为QAbstractItemModelPrivate::rowsRemoved方法,如下图所示

image.png

当前persistent_moved的大小为table的(row * column)

persistent_moved是在QAbstractItemModelPrivate::rowsAboutToBeRemoved里由persistent.indexes决定的,如下图所示

image.png

通过抓取窗体windows消息,发现是由WM_GETOBJECT导致persistent.indexes飙升,参考https://learn.microsoft.com/zh-cn/windows/win32/winauto/wm-ge...,UI自动化程序获取到了窗体句柄,QT处理该消息,进而持久化index

image.png

原因

有自动化程序调用了如下代码(python):

import uiautomation as ui
MainWin = ui.WindowControl(searchDepth=1, ClassName='TaskManagerWindow')
DataGrid = MainWin.DataGridControl(searchDepth=5, ClassName='TmScrollViewer')
TaskList = DataGrid.GetChildren()

解决方法

  1. 重载QMainWindow的nativeevent方法,拦截WM_GETOBJECT消息即可
  2. 不使用endremoverows,删除也使用beginresetmodel()和endresetmodel()

点墨
26 声望3 粉丝

全栈前端开发工程师