QPrinter rounds pagesize if it is close to the standard page sizes (A3, A4 ...)

278 Views Asked by At

I want to save and restore QPrinter::pagesize for PageSize::Custom. But when I save size, I read strange rounding size:

QPrinter p;
for(int i=0; i<20000; ++i) {
    QSizeF size( qreal(rand()%100000)/100, qreal(rand()%100000)/100 );

    p.setPaperSize( size, QPrinter::Millimeter );

    if( size != p.paperSize(QPrinter::Millimeter) ) 
        qDebug() << size <<  "->" << p.paperSize(QPrinter::Millimeter);
}

QSizeF(216.48, 321.33) -> QSizeF(215.9, 322.3)
QSizeF(250.15, 352.36) -> QSizeF(250, 353)
QSizeF(178.75, 227.77) -> QSizeF(177.8, 228.6) // 178.75 - 177.8 = 0.95 !!!
QSizeF(321.24, 445.22) -> QSizeF(322, 445)
QSizeF(182.6, 258.4) -> QSizeF(182, 257) // 258.4 - 257 = 1.4 !!!
QSizeF(382.17, 279.77) -> QSizeF(381, 279.4)
QSizeF(111.1, 208.13) -> QSizeF(110, 208) // 111.1 - 110 = 1.1 !!!
QSizeF(32.32, 43.67) -> QSizeF(32, 45)
QSizeF(114.07, 163.04) -> QSizeF(114, 162)
QSizeF(228.5, 323.36) -> QSizeF(229, 324)
QSizeF(63.81, 92.1) -> QSizeF(64, 91)

11 values have terrible rounding, and ~20000 values are valid.

Size rounded to standard (A0, A4 ......) If its width and height differ by any standard size less than ~ 1.2

How disable it? Example code with problem: (freeze 210 value)

QDoubleSpinBox sb;
sb.setRange(0.0, 300.0);
sb.setValue(210.0);
sb.show();

QObject::connect(&sb, qOverload<double>(&QDoubleSpinBox::valueChanged),[&sb](double value){
    QPrinter pr;
    pr.setPaperSize( QSizeF(value, 297.0), QPrinter::Millimeter );
    sb.blockSignals(true);
    sb.setValue( pr.paperSize(QPrinter::Millimeter).width() );
    sb.blockSignals(false);
});
1

There are 1 best solutions below

5
On

QT5: void setPaperSize(QPrinter::PaperSize newPaperSize) is obsolete.

This is a wild guess: QT uses predefined sizes and PaperSize paperSize() returns the "nearest" one. See this link here but is not well programmed -> obsolete.