【发布时间】:2010-05-28 20:28:21
【问题描述】:
我正在创建一个模仿 A4 打印页面的自定义 Qt 小部件,但在让字体以正确大小呈现时遇到问题。我的小部件使用QPainter::setViewport 和QPainter::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 非常有限。