我想保存和恢复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);
});
答案 0 :(得分:0)
QT5:
void setPaperSize(QPrinter::PaperSize newPaperSize)
是obsolete.
这是一个疯狂的猜测:
QT使用预定义的大小,而PaperSize paperSize()
返回“最近”的大小。参见this link here,但编程不正确->已过时。