mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-22 20:39:25 +02:00
Qt5: fixed slowness with TQtPrinter under MSWindows
(cherry picked from commit 09a4c2fbd4
)
This commit is contained in:
parent
18931fadc2
commit
0068f0ee45
@ -13,6 +13,13 @@
|
|||||||
Uses InterfaceBase, LCLIntf;
|
Uses InterfaceBase, LCLIntf;
|
||||||
|
|
||||||
{.$DEFINE UsePrinterSupportedPapers}
|
{.$DEFINE UsePrinterSupportedPapers}
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
|
{$DEFINE QTPAPERSONDEMAND}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IF DEFINED(QTPAPERSONDEMAND) AND DEFINED(UsePrinterSupportedPapers)}
|
||||||
|
{$UNDEF UsePrinterSupportedPapers}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
const
|
const
|
||||||
DEFAULT_PAPER_NAME = 'A4';
|
DEFAULT_PAPER_NAME = 'A4';
|
||||||
@ -182,18 +189,32 @@ var
|
|||||||
|
|
||||||
//CustomPageSize should be automatically set by setting different paper size
|
//CustomPageSize should be automatically set by setting different paper size
|
||||||
//than known paper size. Qt4 asserts when CustomPageSize is directly setted up.
|
//than known paper size. Qt4 asserts when CustomPageSize is directly setted up.
|
||||||
|
{$IFNDEF QTPAPERSONDEMAND}
|
||||||
{$IFDEF LCLQt}
|
{$IFDEF LCLQt}
|
||||||
if (pgSize > 30) then
|
if pgSize < 30 then
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
QtDefaultPrinter.PageSize := PgSize;
|
QtDefaultPrinter.PageSize := PgSize;
|
||||||
|
{$ENDIF}
|
||||||
FPapers[i].PageSize := PgSize;
|
FPapers[i].PageSize := PgSize;
|
||||||
|
|
||||||
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
FPapers[i].PageRect := Rect(0, 0, 0, 0);
|
||||||
|
FPapers[i].PaperRect := Rect(0, 0, 0, 0);
|
||||||
|
// imediatelly fill current papersize
|
||||||
|
if QtDefaultPrinter.PageSize = FPapers[i].PageSize then
|
||||||
|
begin
|
||||||
|
{$ENDIF}
|
||||||
FPapers[i].PageRect := QtDefaultPrinter.PageRect;
|
FPapers[i].PageRect := QtDefaultPrinter.PageRect;
|
||||||
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
|
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
|
||||||
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
if PaperName=DEFAULT_PAPER_NAME then
|
if PaperName=DEFAULT_PAPER_NAME then
|
||||||
FDefaultPaperIndex := i;
|
FDefaultPaperIndex := i;
|
||||||
if pgSize=30 then
|
if pgSize=30 then
|
||||||
customPaperAdded := true;
|
customPaperAdded := true;
|
||||||
//DebugLn('Cached: %20s PaperRect=%s PageRect=%s',[PaperName, dbgs(FPapers[i].PaperRect), dbgs(FPapers[i].PageRect)]);
|
// DebugLn('Cached: %20s PaperRect=%s PageRect=%s pgSize %d',[PaperName, dbgs(FPapers[i].PaperRect), dbgs(FPapers[i].PageRect), pgSize]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure AddAll;
|
procedure AddAll;
|
||||||
@ -207,6 +228,7 @@ var
|
|||||||
oldPageSize := QtDefaultPrinter.PageSize;
|
oldPageSize := QtDefaultPrinter.PageSize;
|
||||||
for i:=QPagedPaintDeviceA4 to QPagedPaintDeviceCustom do
|
for i:=QPagedPaintDeviceA4 to QPagedPaintDeviceCustom do
|
||||||
Add(ArrPapers[i], i);
|
Add(ArrPapers[i], i);
|
||||||
|
if oldPageSize <> QtDefaultPrinter.PageSize then
|
||||||
QtDefaultPrinter.PageSize := oldPageSize;
|
QtDefaultPrinter.PageSize := oldPageSize;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
for i:=QPrinterA4 to QPrinterCustom do
|
for i:=QPrinterA4 to QPrinterCustom do
|
||||||
@ -486,6 +508,13 @@ begin
|
|||||||
if i >= 0 then
|
if i >= 0 then
|
||||||
begin
|
begin
|
||||||
QtDefaultPrinter.PageSize := FPapers[i].PageSize;
|
QtDefaultPrinter.PageSize := FPapers[i].PageSize;
|
||||||
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
if FPapers[i].PaperRect = Rect(0, 0, 0, 0) then
|
||||||
|
begin
|
||||||
|
FPapers[i].PageRect := QtDefaultPrinter.PageRect;
|
||||||
|
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
DoSetOrientation(O);
|
DoSetOrientation(O);
|
||||||
end else
|
end else
|
||||||
raise Exception.Create('TQtPrinters: Paper '+AName+' not supported.');
|
raise Exception.Create('TQtPrinters: Paper '+AName+' not supported.');
|
||||||
@ -495,6 +524,9 @@ function TQtPrinters.DoGetPaperRect(aName: string; var aPaperRc: TPaperRect
|
|||||||
): Integer;
|
): Integer;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
APageSize: {$IFDEF LCLQt}QPrinterPageSize{$ELSE}QPagedPaintDevicePageSize{$ENDIF};
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
DoInitializeCachePapers;
|
DoInitializeCachePapers;
|
||||||
{$IFDEF VERBOSE_QT_PRINTING}
|
{$IFDEF VERBOSE_QT_PRINTING}
|
||||||
@ -507,7 +539,17 @@ begin
|
|||||||
begin
|
begin
|
||||||
{When we set QPrinter into FullPage, rect is not same
|
{When we set QPrinter into FullPage, rect is not same
|
||||||
on all platforms, this is fixed with qt-4.4}
|
on all platforms, this is fixed with qt-4.4}
|
||||||
if Orientation in [poPortrait, poReversePortrait] then begin
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
APageSize := QtDefaultPrinter.PageSize;
|
||||||
|
if (PaperRect = Rect(0, 0, 0, 0)) then
|
||||||
|
begin
|
||||||
|
QtDefaultPrinter.PageSize := PageSize;
|
||||||
|
PageRect := QtDefaultPrinter.PageRect;
|
||||||
|
PaperRect := QtDefaultPrinter.PaperRect;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
if Orientation in [poPortrait, poReversePortrait] then
|
||||||
|
begin
|
||||||
APaperRC.WorkRect := PageRect;
|
APaperRC.WorkRect := PageRect;
|
||||||
APaperRC.PhysicalRect := PaperRect;
|
APaperRC.PhysicalRect := PaperRect;
|
||||||
end else begin
|
end else begin
|
||||||
@ -516,6 +558,10 @@ begin
|
|||||||
APaperRC.PhysicalRect :=
|
APaperRC.PhysicalRect :=
|
||||||
Rect(PaperRect.Top, PaperRect.Left, PaperRect.Bottom, PaperRect.Right);
|
Rect(PaperRect.Top, PaperRect.Left, PaperRect.Bottom, PaperRect.Right);
|
||||||
end;
|
end;
|
||||||
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
if APageSize <> QtDefaultPrinter.PageSize then
|
||||||
|
QtDefaultPrinter.PageSize := APageSize;
|
||||||
|
{$ENDIF}
|
||||||
Result := 1;
|
Result := 1;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -523,6 +569,7 @@ end;
|
|||||||
function TQtPrinters.DoSetPrinter(aName: string): Integer;
|
function TQtPrinters.DoSetPrinter(aName: string): Integer;
|
||||||
var
|
var
|
||||||
StrList: TStringList;
|
StrList: TStringList;
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
DoInitializeCachePapers;
|
DoInitializeCachePapers;
|
||||||
{$IFDEF VERBOSE_QT_PRINTING}
|
{$IFDEF VERBOSE_QT_PRINTING}
|
||||||
@ -540,6 +587,22 @@ begin
|
|||||||
if not QtDefaultPrinter.PrinterActive then
|
if not QtDefaultPrinter.PrinterActive then
|
||||||
begin
|
begin
|
||||||
QtDefaultPrinter.PrinterName := UTF8Decode(aName);
|
QtDefaultPrinter.PrinterName := UTF8Decode(aName);
|
||||||
|
|
||||||
|
{$IFDEF QTPAPERSONDEMAND}
|
||||||
|
for i := 0 to High(FPapers) do
|
||||||
|
begin
|
||||||
|
if FPapers[i].PageSize = QtDefaultPrinter.PageSize then
|
||||||
|
begin
|
||||||
|
if FPapers[i].PaperRect = Rect(0, 0, 0, 0) then
|
||||||
|
begin
|
||||||
|
FPapers[i].PageRect := QtDefaultPrinter.PageRect;
|
||||||
|
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
|
||||||
|
end;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
{$ifdef UsePrinterSupportedPapers}
|
{$ifdef UsePrinterSupportedPapers}
|
||||||
CachePapers(true);
|
CachePapers(true);
|
||||||
{$endif}
|
{$endif}
|
||||||
|
Loading…
Reference in New Issue
Block a user