Qt,Qt5,Qt6: fixed mouse capture for TEdit and TComboBox, see details in related issue. Issue #40379

This commit is contained in:
Željan Rikalo 2023-12-05 16:32:37 +01:00
parent 469e1318dd
commit ddc2c4135b
3 changed files with 69 additions and 6 deletions

View File

@ -1085,7 +1085,7 @@ type
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
procedure preferredSize(var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
procedure grabMouse; override;
procedure SlotActivate(index: Integer); cdecl;
procedure SlotChange(p1: PWideString); cdecl;
procedure SlotSelect(index: Integer); cdecl;
@ -1131,6 +1131,7 @@ type
function getReadOnly: Boolean;
function getText: WideString; override;
function getTextStatic: Boolean; override;
procedure grabMouse; override;
procedure setAlignment(const AAlignment: QtAlignment);
procedure setBorder(const ABorder: Boolean);
procedure setDefaultColorRoles; override;
@ -11495,6 +11496,14 @@ begin
PreferredHeight := Size.cy;
end;
procedure TQtComboBox.grabMouse;
begin
if Assigned(LCLObject) and getEditable and not (csDesigning in LCLObject.ComponentState) then
LineEdit.grabMouse
else
inherited grabMouse;
end;
procedure TQtComboBox.SlotActivate(index: Integer); cdecl;
var
Msg: TLMessage;
@ -11587,7 +11596,10 @@ function TQtAbstractSpinBox.LineEditEventFilter(Sender: QObjectH; Event: QEventH
begin
Result := False;
QEvent_accept(Event);
if QEvent_type(Event) = QEventFontChange then
if (QEvent_type(Event) = QEventFontChange) then
Result := EventFilter(QWidgetH(Sender), Event)
else
if (QEvent_type(Event) >= QEventMouseButtonPress) and (QEvent_type(Event) <= QEventMouseMove) then
Result := EventFilter(QWidgetH(Sender), Event);
end;
@ -11760,6 +11772,15 @@ begin
Result := False;
end;
procedure TQtAbstractSpinBox.grabMouse;
begin
if Assigned(LCLObject) and not (csDesigning in LCLObject.ComponentState)
and Assigned(LineEdit) then
QWidget_grabMouse(LineEdit)
else
inherited grabMouse;
end;
procedure TQtAbstractSpinBox.setAlignment(const AAlignment: QtAlignment);
begin
QAbstractSpinBox_setAlignment(QSpinBoxH(Widget), AAlignment);

View File

@ -1100,7 +1100,7 @@ type
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
procedure preferredSize(var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
procedure grabMouse; override;
procedure SlotActivate(index: Integer); cdecl;
procedure SlotChange(p1: PWideString); cdecl;
procedure SlotSelect(index: Integer); cdecl;
@ -1147,6 +1147,7 @@ type
function getReadOnly: Boolean;
function getText: WideString; override;
function getTextStatic: Boolean; override;
procedure grabMouse; override;
procedure setAlignment(const AAlignment: QtAlignment);
procedure setBorder(const ABorder: Boolean);
procedure setDefaultColorRoles; override;
@ -11751,6 +11752,14 @@ begin
PreferredHeight := Size.cy;
end;
procedure TQtComboBox.grabMouse;
begin
if Assigned(LCLObject) and getEditable and not (csDesigning in LCLObject.ComponentState) then
LineEdit.grabMouse
else
inherited grabMouse;
end;
procedure TQtComboBox.SlotActivate(index: Integer); cdecl;
var
Msg: TLMessage;
@ -11843,7 +11852,10 @@ function TQtAbstractSpinBox.LineEditEventFilter(Sender: QObjectH; Event: QEventH
begin
Result := False;
QEvent_accept(Event);
if QEvent_type(Event) = QEventFontChange then
if (QEvent_type(Event) = QEventFontChange) then
Result := EventFilter(QWidgetH(Sender), Event)
else
if (QEvent_type(Event) >= QEventMouseButtonPress) and (QEvent_type(Event) <= QEventMouseMove) then
Result := EventFilter(QWidgetH(Sender), Event);
end;
@ -12027,6 +12039,15 @@ begin
Result := False;
end;
procedure TQtAbstractSpinBox.grabMouse;
begin
if Assigned(LCLObject) and not (csDesigning in LCLObject.ComponentState)
and Assigned(LineEdit) then
QWidget_grabMouse(LineEdit)
else
inherited grabMouse;
end;
procedure TQtAbstractSpinBox.setAlignment(const AAlignment: QtAlignment);
begin
QAbstractSpinBox_setAlignment(QSpinBoxH(Widget), AAlignment);

View File

@ -1103,7 +1103,7 @@ type
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
procedure preferredSize(var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
procedure grabMouse; override;
procedure SlotActivate(index: Integer); cdecl;
procedure SlotChange(p1: PWideString); cdecl;
procedure SlotSelect(index: Integer); cdecl;
@ -1150,6 +1150,7 @@ type
function getReadOnly: Boolean;
function getText: WideString; override;
function getTextStatic: Boolean; override;
procedure grabMouse; override;
procedure setAlignment(const AAlignment: QtAlignment);
procedure setBorder(const ABorder: Boolean);
procedure setDefaultColorRoles; override;
@ -11783,6 +11784,14 @@ begin
PreferredHeight := Size.cy;
end;
procedure TQtComboBox.grabMouse;
begin
if Assigned(LCLObject) and getEditable and not (csDesigning in LCLObject.ComponentState) then
LineEdit.grabMouse
else
inherited grabMouse;
end;
procedure TQtComboBox.SlotActivate(index: Integer); cdecl;
var
Msg: TLMessage;
@ -11875,7 +11884,10 @@ function TQtAbstractSpinBox.LineEditEventFilter(Sender: QObjectH; Event: QEventH
begin
Result := False;
QEvent_accept(Event);
if QEvent_type(Event) = QEventFontChange then
if (QEvent_type(Event) = QEventFontChange) then
Result := EventFilter(QWidgetH(Sender), Event)
else
if (QEvent_type(Event) >= QEventMouseButtonPress) and (QEvent_type(Event) <= QEventMouseMove) then
Result := EventFilter(QWidgetH(Sender), Event);
end;
@ -12059,6 +12071,15 @@ begin
Result := False;
end;
procedure TQtAbstractSpinBox.grabMouse;
begin
if Assigned(LCLObject) and not (csDesigning in LCLObject.ComponentState)
and Assigned(LineEdit) then
QWidget_grabMouse(LineEdit)
else
inherited grabMouse;
end;
procedure TQtAbstractSpinBox.setAlignment(const AAlignment: QtAlignment);
begin
QAbstractSpinBox_setAlignment(QSpinBoxH(Widget), AAlignment);