qt中输出界面字体大小 (qt中绘制曲线)

对于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));
    }
}

程序运行结果:

qt界面自适应屏幕大小,qt控件间距随窗口变化

图1 设置逻辑窗口前后,同一段代码所绘制文字的实际显示大小发生了变化

程序从字体高度5个像素,到30个像素,逐一绘制字符串。左侧为没有设置逻辑窗口时的绘制,右侧变大的字体是设置了逻辑窗口下的绘制效果。可以看到,设置的逻辑窗口数值上比物理窗口小的话,同样的绘制字符串的代码实际绘制出来的字体大小,是会变大的。

【结语】本文通过代码测试,证实了在逻辑窗口的逻辑尺寸小于物理窗口的大小(仅仅在字面上小),同样高度字体绘制出来的实际字体,其大小是会变大的。