0

我想为 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);
});
4

1 回答 1

0

QT5: void setPaperSize(QPrinter::PaperSize newPaperSize)过时。

这是一个疯狂的猜测:QT 使用预定义的大小并PaperSize paperSize()返回“最近”的大小。请在此处查看此链接,但没有很好地编程-> 已过时。

于 2018-11-29T09:52:12.773 回答