diff --git a/lcl/interfaces/qt/qtobjects.pas b/lcl/interfaces/qt/qtobjects.pas index 417238a99c..5eb227d9b2 100644 --- a/lcl/interfaces/qt/qtobjects.pas +++ b/lcl/interfaces/qt/qtobjects.pas @@ -287,6 +287,8 @@ type destructor Destroy; override; function containsPoint(X,Y: Integer): Boolean; function containsRect(R: TRect): Boolean; + function intersects(R: TRect): Boolean; overload; + function intersects(Rgn: QRegionH): Boolean; overload; function GetRegionType: integer; function getBoundingRect: TRect; function numRects: Integer; @@ -1767,6 +1769,16 @@ begin Result := QRegion_contains(Widget, PRect(@R)); end; +function TQtRegion.intersects(R: TRect): Boolean; +begin + Result := QRegion_intersects(Widget, PRect(@R)); +end; + +function TQtRegion.intersects(Rgn: QRegionH): Boolean; +begin + Result := QRegion_intersects(Widget, Rgn); +end; + function TQtRegion.GetRegionType: integer; var R: TRect; diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 3c641fe957..cb8988bdb7 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -328,6 +328,7 @@ type protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public + procedure setFocusPolicy(const APolicy: QtFocusPolicy); override; function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; procedure AttachEvents; override; end; @@ -5618,6 +5619,14 @@ begin FHasPaint := True; end; +procedure TQtScrollBar.setFocusPolicy(const APolicy: QtFocusPolicy); +begin + if FOwnWidget and Assigned(LCLObject) and not LCLObject.TabStop then + inherited setFocusPolicy(QtNoFocus) + else + inherited setFocusPolicy(APolicy); +end; + function TQtScrollBar.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; begin diff --git a/lcl/interfaces/qt/qtwinapi.inc b/lcl/interfaces/qt/qtwinapi.inc index 7b7ab6d4fd..eed94eb607 100644 --- a/lcl/interfaces/qt/qtwinapi.inc +++ b/lcl/interfaces/qt/qtwinapi.inc @@ -4037,28 +4037,17 @@ end; function TQtWidgetSet.RectVisible(dc : hdc; const ARect: TRect) : Boolean; var - w: QWidgetH; - Region: QRegionH; + QtDC: TQtDeviceContext; begin {$ifdef VerboseQtWinAPI} writeln('[WinAPI RectVisible] '); {$endif} Result := False; if not IsValidDC(DC) then Exit; - w := TQtDeviceContext(DC).Parent; - if w <> nil then - begin - if QWidget_isVisible(w) then - begin - Region := QRegion_create; - try - QWidget_visibleRegion(w, Region); - Result := QRegion_contains(Region, PRect(@ARect)); - finally - QRegion_destroy(Region); - end; - end; - end; + QtDC := TQtDeviceContext(DC); + // as MSDN says only clipping region can play here + if QtDC.getClipping then + Result := QtDC.getClipRegion.containsRect(ARect); end; {------------------------------------------------------------------------------