所见即所得的Qt - 字体大小的困境
我正在创建一个模仿A4打印页面的自定义Qt小部件,并且在正确尺寸下呈现字体时出现问题。我的小部件使用QPainter::setViewport
和QPainter::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
当量。):嗯,事实证明,我的代码是做工精细毕竟。我将它转换成与打印机一起工作,将其打印出来,然后使用各种文字处理程序打印相同的文本,结果完全相同。似乎要求字体大小不考虑下降,这似乎是常态。
QFont可能会或可能不会匹配您请求的确切字体。 QFontMetrics::height()在我的系统上返回284的大小,但QFontInfo::pixelSize()返回所请求的大小254。我假设不同的是,height()
包括下降,其中pixelSize()
返回匹配字体的像素大小,这意味着我有一个匹配。
至于绘制,放置和转换,您需要小心,因为打印机设备将不会与屏幕设备相同,也不会与解决方案匹配。为了进一步加剧问题,您无法在打印对话框中调用设置的情况下获得确切的打印机指标。设备独立性让你接近所见即所得,但并不总是足够接近。
在您的示例中,绘图设备是this
。因此,您可以通过logicalDpiX()和logicalDpiY()函数(以及它们的物理等效项)获得逻辑dpi。
好吧,所以如果我使用setPixelSize和正确的上升,那么我最终会得到一个字体,其中height()是正确的。问题是我如何找出事先提升的东西! – Rob 2010-05-28 21:49:41
排版可能会限制上升/下降与字体大小成正比。如果是这样,你应该抓住上升,下降和pixelSize两个不同的目标尺寸,然后插入你需要的尺寸。我预计这会关闭至多两个像素(每个上升和下降一个)。至少应该很容易测试。 – 2010-05-28 22:12:26
您是否正在制作一个字处理器类应用程序,因为我希望看到您的一些代码。我有兴趣构建一个类似于应用程序的文字处理器,但我发现QTextEdit非常有限。 – 2017-05-09 18:16:20