如果QPrinter接近标准页面大小(A3,A4 ...),则对页面大小进行四舍五入

时间:2018-11-29 08:08:45

标签: qt qprinter

我想保存和恢复QPrinter :: pagesize为PageSize :: Custom。 但是当我保存大小时,我看到了奇怪的舍入大小:

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个值的舍入很糟糕,〜20000个值有效。

尺寸四舍五入为标准尺寸(A0,A4 ......) 如果其宽度和高度之间的任何标准尺寸相差小于〜1.2

如何禁用它?有问题的示例代码:(冻结210值)

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 个答案:

答案 0 :(得分:0)

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

这是一个疯狂的猜测: QT使用预定义的大小,而PaperSize paperSize()返回“最近”的大小。参见this link here,但编程不正确->已过时。