对于Qt编程,绘制文字是一项重要的工作。一般情况下,我们直接使用文字绘制函数,例如:
QFont font;
font.setPixelSize(30); //设置字体高度为30个像素
painter.setFont(font);
painter.drawText(0,30, "Hello,world!"); //从(0,30)的位置起,绘制一个字符串
说明:这里绘制字体的坐标选择(0,30),而不是(0,0),是因为这里的坐标指字符的左下角坐标,非左上角坐标。
在实际的绘图中,比如绘制三角函数,往往会设置逻辑窗口。那么问题来了,在逻辑窗口下,绘制的文字的实际大小,会不会随着逻辑窗口设置不同而发生变化呢?
在设置逻辑窗口前,比如一个窗口大小为800*600像素,如果设置成逻辑窗口大小为400*300,那就意味着窗口的逻辑宽度和逻辑高度在表面上,数值都变小了,在逻辑窗口中100等于物理窗口中的200像素。
下面就用一段代码来测试一下,逻辑窗口中,设置同样大小的字体,会不会同样像上面那样变大呢?在代码中,我们先在物理窗口中,用不同高度的字体,绘制字符串,然后,设置逻辑窗口,把逻辑高度和逻辑宽度都设置成原窗口像素数值的一半,用同样的绘制文字的代码,再绘制一遍,看看二者在大小上是否发生变化。
void Widget::differentFontPixelTest(QPainter &painter)
{
QFont font;
int x=0,y=0;
int w = width(); //获取物理窗口宽度
int h = height(); //获取物理窗口高度
painter.save(); //保存绘图机状态
painter.setWindow(0,0,w/2,h/2); //设置逻辑窗口,逻辑宽度和高度数值上都砍一半
for(int i = 5; i<= 30; i++)
{
font.setPixelSize(i); //从5像素大小开始,用不同高度的字体绘制同一个字符串
y += (i+1); //获取字体的高度,然后加入一个像素间隔。下一次绘制时,y坐标要进行累加,要不然字体会上下重叠。
painter.setFont(font);
painter.drawText(80,y,"Hello"+QString::number(i)); //在字符串后面也加入表示字体高度的数值
}
painter.restore(); //恢复绘图机状态,上面设置的逻辑窗口不再起作用,回到原始的物理窗口中绘图
y=0; //把y归零,便于与前面绘制的文字顶对齐
//把前面绘制文字的代码,此处重新执行一遍。除了没有逻辑窗口,其他都一样
for(int i = 5; i<= 30; i++)
{
font.setPixelSize(i);
y += (i+10); //两次绘图,行距加大到10个像素,因为物理窗口中的行间距,比逻辑窗口中小
painter.setFont(font);
painter.drawText(10,y,"Hello"+QString::number(i));
}
}
程序运行结果:

图1 设置逻辑窗口前后,同一段代码所绘制文字的实际显示大小发生了变化
程序从字体高度5个像素,到30个像素,逐一绘制字符串。左侧为没有设置逻辑窗口时的绘制,右侧变大的字体是设置了逻辑窗口下的绘制效果。可以看到,设置的逻辑窗口数值上比物理窗口小的话,同样的绘制字符串的代码实际绘制出来的字体大小,是会变大的。
【结语】本文通过代码测试,证实了在逻辑窗口的逻辑尺寸小于物理窗口的大小(仅仅在字面上小),同样高度字体绘制出来的实际字体,其大小是会变大的。