2010-05-28 23 views
3

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

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查询字体高度是283高。

是否有其他人知道如何使用像这样的自定义映射模式点字体大小?这一定是可能的。请注意,我看不出逻辑/设备点之间的任何转换

编辑(即在Win32 DPtoLP/LPtoDP当量。):嗯,事实证明,我的代码是做工精细毕竟。我将它转换成与打印机一起工作,将其打印出来,然后使用各种文字处理程序打印相同的文本,结果完全相同。似乎要求字体大小不考虑下降,这似乎是常态。

+0

您是否正在制作一个字处理器类应用程序,因为我希望看到您的一些代码。我有兴趣构建一个类似于应用程序的文字处理器,但我发现QTextEdit非常有限。 – 2017-05-09 18:16:20

回答

1

QFont可能会或可能不会匹配您请求的确切字体。 QFontMetrics::height()在我的系统上返回284的大小,但QFontInfo::pixelSize()返回所请求的大小254。我假设不同的是,height()包括下降,其中pixelSize()返回匹配字体的像素大小,这意味着我有一个匹配。

至于绘制,放置和转换,您需要小心,因为打印机设备将不会与屏幕设备相同,也不会与解决方案匹配。为了进一步加剧问题,您无法在打印对话框中调用设置的情况下获得确切的打印机指标。设备独立性让你接近所见即所得,但并不总是足够接近。

在您的示例中,绘图设备是this。因此,您可以通过logicalDpiX()logicalDpiY()函数(以及它们的物理等效项)获得逻辑dpi。

+0

好吧,所以如果我使用setPixelSize和正确的上升,那么我最终会得到一个字体,其中height()是正确的。问题是我如何找出事先提升的东西! – Rob 2010-05-28 21:49:41

+0

排版可能会限制上升/下降与字体大小成正比。如果是这样,你应该抓住上升,下降和pixelSize两个不同的目标尺寸,然后插入你需要的尺寸。我预计这会关闭至多两个像素(每个上升和下降一个)。至少应该很容易测试。 – 2010-05-28 22:12:26