From 4ebb387946b06b434847a11a846dd9fcb46cc1ce Mon Sep 17 00:00:00 2001 From: zeljko Date: Sun, 31 Dec 2017 00:37:50 +0000 Subject: [PATCH] Qt: fixed crash with checkable listview when item is deleted inside OnItemChecked event. issue #32869 git-svn-id: trunk@56888 - --- lcl/interfaces/qt/qtwidgets.pas | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 4d3de192b3..e35857d780 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -12827,8 +12827,9 @@ begin else SetItemLastCheckStateInternal(AItem, QtUnChecked); - SendMessage(AItem); + // if AItem is deleted in mouse event FDelayedCheckItem becomes nil and that's fine. issue #32869 FDelayedCheckItem := AItem; + SendMessage(AItem); end; end; end else @@ -12839,6 +12840,8 @@ begin SetItemLastCheckStateInternal(FDelayedCheckItem, QListWidgetItem_checkState(FDelayedCheckItem)); SendMessage(FDelayedCheckItem); end; + if FDelayedCheckItem = nil then // issue #32869 + exit; FDelayedCheckItem := nil; SetItemLastCheckStateInternal(AItem, QListWidgetItem_checkState(AItem)); SendMessage(AItem); @@ -13756,6 +13759,8 @@ begin if (getSelectionMode = QAbstractItemViewSingleSelection) then setCurrentRow(-1); Item := QListWidget_takeitem(QListWidgetH(Widget), AIndex); + if FDelayedCheckItem = Item then + FDelayedCheckItem := nil; QListWidgetItem_destroy(Item); end; @@ -14466,8 +14471,9 @@ begin else SetItemLastCheckStateInternal(AItem, QtUnChecked); - SendMessage(AItem); + // if AItem is deleted in mouse event FDelayedCheckItem becomes nil and that's fine. issue #32869 FDelayedCheckItem := AItem; + SendMessage(AItem); end; end; end else @@ -14478,6 +14484,8 @@ begin SetItemLastCheckStateInternal(FDelayedCheckItem, QTreeWidgetItem_checkState(FDelayedCheckItem, 0)); SendMessage(FDelayedCheckItem); end; + if FDelayedCheckItem = nil then // issue #32869 + exit; FDelayedCheckItem := nil; SetItemLastCheckStateInternal(AItem, QTreeWidgetItem_checkState(AItem, 0)); SendMessage(AItem); @@ -15001,6 +15009,8 @@ begin Index := -1; if Index <> -1 then FSelection.Remove(Item); + if FDelayedCheckItem = Item then + FDelayedCheckItem := nil; Item := takeTopLevelItem(AIndex); if Item <> nil then QTreeWidgetItem_destroy(Item);