与Qt的WYSIWYG - 字体大小的困境

时间:2010-05-28 20:28:21

标签: c++ qt qt4

我正在创建一个模仿A4打印页面的自定义Qt小部件,并且在使字体以正确的大小呈现时遇到问题。我的小部件使用QPainter::setViewportQPainter::setWindow模仿A4页面,使用十分之一毫米的单位,这使我可以轻松绘制。但是,尝试以特定点大小创建字体似乎不起作用,并且使用QFont:setPixelSize不准确。这是一些代码:

View::View(QWidget *parent) :
    QWidget(parent),
    printer(new QPrinter)
{
    printer->setPaperSize(QPrinter::A4);
    printer->setFullPage(true);
}

void View::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.setWindow(0, 0, 2100, 2970);
    painter.setViewport(0, 0, printer->width(), printer->height());
    // Draw a rect at x = 1cm, y = 1cm, 6cm wide and 1 inch high
    painter.drawRect(100, 100, 600, 254);

    // Create a 72pt (1 inch) high font
    QFont font("Arial");
    font.setPixelSize(254);
    painter.setFont(font);
    // Draw in the same box
    // The font is too large
    painter.drawText(QRect(100, 100, 600, 254), tr("Wg\u0102"));
    // Ack - the actual font size reported by the metrics is 283 pixels!
    const QFontMetrics fontMetrics = painter.fontMetrics();
    qDebug() << "Font height = " << fontMetrics.height();
}

所以我要求一个254高字体(1英寸,72分),当我通过QFontMetrics查询字体高度时,它太大了,当然它已经足够高了。

在使用像这样的自定义映射模式时,有没有其他人知道如何在点中使用字体大小?一定是可能的。请注意,我无法看到如何在逻辑/设备点之间进行转换(即Win32 DPtoLP / LPtoDP等效。)

编辑:事实证明我的代码工作正常。我将它转换为打印机,打印出来然后使用各种文字处理器打印相同的文本,结果完全相同。似乎要求字体大小不考虑下降,这似乎是常态。

1 个答案:

答案 0 :(得分:1)

QFont可能或可能无法匹配您请求的确切字体。 QFontMetrics::height()在我的系统上返回大小为284,但QFontInfo::pixelSize()返回的大小为254,这是请求的大小。我假设差异在于height()包含pixelSize()返回匹配字体的像素大小的下降,这意味着我有匹配。

对于绘图,放置和转换,您需要小心,因为打印机设备与屏幕设备不同,分辨率也不匹配。为了进一步加剧问题,如果不在打印对话框上调用设置,则无法获得准确的打印机指标。设备独立性使您接近WYSIWYG,但并不总是足够接近。

在您的样本中,绘图设备为this。因此,您可以通过logicalDpiX()logicalDpiY()函数(以及它们的物理等价物)获得逻辑dpi。