Qt5,Qt6: do not send LM_CLICKED if button lost focus after mouse down. issue #41237

This commit is contained in:
Željan Rikalo 2024-11-11 18:07:26 +01:00
parent dfb7c2bd04
commit c97c2774da
2 changed files with 52 additions and 0 deletions

View File

@ -549,10 +549,12 @@ type
private
FClickedHook: QAbstractButton_hookH;
FToggledHook: QAbstractButton_hookH;
procedure PushButtonUnblock(Data: PtrInt);
protected
function CreateWidget(const AParams: TCreateParams): QWidgetH; override;
public
procedure preferredSize(var PreferredWidth, PreferredHeight: integer; {%H-}WithThemeSpace: Boolean); override;
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
public
procedure SetDefault(const ADefault: Boolean);
procedure AttachEvents; override;
@ -6184,6 +6186,30 @@ begin
PreferredHeight := Size.cy;
end;
procedure TQtPushButton.PushButtonUnblock(Data: PtrInt);
begin
QObject_blockSignals(QObjectH(Data), False);
end;
function TQtPushButton.EventFilter(Sender: QObjectH; Event: QEventH): Boolean;
cdecl;
begin
Result := False;
case QEvent_type(Event) of
QEventMouseButtonRelease:
begin
Result := SlotMouse(Sender, Event);
if not QWidget_hasFocus(Widget) and (QMouseEvent_button(QMouseEventH(Event)) = QtLeftButton) then
begin
QObject_blockSignals(Sender, True);
Application.QueueAsyncCall(@PushButtonUnblock, PtrInt(Sender));
end;
end;
else
Result := inherited EventFilter(Sender, Event);
end;
end;
procedure TQtPushButton.SetDefault(const ADefault: Boolean);
begin
QPushButton_setDefault(QPushButtonH(Widget), ADefault);

View File

@ -551,10 +551,12 @@ type
private
FClickedHook: QAbstractButton_hookH;
FToggledHook: QAbstractButton_hookH;
procedure PushButtonUnblock(Data: PtrInt);
protected
function CreateWidget(const AParams: TCreateParams): QWidgetH; override;
public
procedure preferredSize(var PreferredWidth, PreferredHeight: integer; {%H-}WithThemeSpace: Boolean); override;
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
public
procedure SetDefault(const ADefault: Boolean);
procedure AttachEvents; override;
@ -6199,6 +6201,30 @@ begin
PreferredHeight := Size.cy;
end;
procedure TQtPushButton.PushButtonUnblock(Data: PtrInt);
begin
QObject_blockSignals(QObjectH(Data), False);
end;
function TQtPushButton.EventFilter(Sender: QObjectH; Event: QEventH): Boolean;
cdecl;
begin
Result := False;
case QEvent_type(Event) of
QEventMouseButtonRelease:
begin
Result := SlotMouse(Sender, Event);
if not QWidget_hasFocus(Widget) and (QMouseEvent_button(QMouseEventH(Event)) = QtLeftButton) then
begin
QObject_blockSignals(Sender, True);
Application.QueueAsyncCall(@PushButtonUnblock, PtrInt(Sender));
end;
end;
else
Result := inherited EventFilter(Sender, Event);
end;
end;
procedure TQtPushButton.SetDefault(const ADefault: Boolean);
begin
QPushButton_setDefault(QPushButtonH(Widget), ADefault);