gpt4 book ai didi

c++ - Qt 所见即所得 - 字体大小问题

转载 作者:太空狗 更新时间:2023-10-29 23:09:59 33 4
gpt4 key购买 nike

我正在创建一个模仿 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 等价物。)

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

最佳答案

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

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

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

关于c++ - Qt 所见即所得 - 字体大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932290/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com