使用 Qt 的所见即所得 - 字体大小问题

Posted

技术标签:

【中文标题】使用 Qt 的所见即所得 - 字体大小问题【英文标题】:WYSIWYG with Qt - font size woes 【发布时间】:2010-05-28 20:28:21 【问题描述】:

我正在创建一个模仿 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 查询字体高度时,它太大了,果然是 283 高。

在使用这样的自定义映射模式时,还有其他人知道如何以磅为单位使用字体大小吗?这一定是可能的。请注意,我也看不到如何在逻辑/设备点之间进行转换(即 Win32 DPtoLP/LPtoDP 等效项。)

编辑:好吧,事实证明我的代码运行良好。我将它转换为与打印机一起使用,将其打印出来,然后使用各种文字处理器打印相同的文本,结果完全相同。似乎要求字体大小没有考虑下降,这似乎是常态。

【问题讨论】:

您是否正在制作文字处理器类型的应用程序,因为我有兴趣查看您的一些代码。我有兴趣构建一种文字处理器类型的应用程序,但我发现 QTextEdit 非常有限。 【参考方案1】:

QFont 可能会也可能不会匹配您请求的确切字体。 QFontMetrics::height() 在我的系统上返回 284 的大小,但 QFontInfo::pixelSize() 返回的大小是 254,这是所要求的。我假设不同之处在于height() 包括下降,其中pixelSize() 返回匹配字体的像素大小,暗示我有匹配。

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

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

【讨论】:

好的,所以如果我使用 setPixelSize 和正确的上升,那么我最终会得到一个 height() 正确的字体。问题是我如何提前知道上升是什么! 排版可能会限制上升/下降与字体大小成正比。如果是这样,您应该以两个不同的所需目标大小获取上升、下降和像素大小,然后插入您需要的大小。我希望它最多偏离两个像素(一个用于上升和下降)。至少应该很容易测试。

以上是关于使用 Qt 的所见即所得 - 字体大小问题的主要内容,如果未能解决你的问题,请参考以下文章

GWT 的所见即所得编辑器组件

jsp中的所见即所得编辑器[关闭]

为啥我的所见即所得编辑器在 vuejs 中运行如此缓慢?

什么基于浏览器的所见即所得编辑器尊重我的 HTML 格式? [关闭]

“Android”中的所见即所得视图编辑器?

IDEA如何设置spring-boot-devtools即所见即所得