我想为 PageSize::Custom 保存和恢复 QPrinter::pagesize。但是当我保存大小时,我读到了奇怪的舍入大小:
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) // 77. = 178.795 - 178.795 - 178.795 - QSizeF(178.75, 227.77) !!
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) -> Q尺寸F(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);
});