【发布时间】:2018-11-29 08:08:44
【问题描述】:
我想为 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) // 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);
});
【问题讨论】:
-
我为什么这么问。打开 QtCreator;按打印;设置页面大小:A4;设置页面大小自定义;鼠标滚动不工作的宽度和高度旋转框!因为 209,211 舍入为 210。