一、背景介绍。本文章是基于QT5.9.3版本来测试和运行。

二、利用QTCreator 创建工程

文件→新建文件或项目→Application→Qt widgets Application→(位置和名字,版本选择)→Details(选择基类QWidget)

然后会生成ui文件和widget.cpp widget.h和main.cpp文件

三、在widget.h文件中,添加paintEvent函数。

并且在widget.cpp中添加实现函数,文字绘制的实现就在这个函数中。

protected:
    void paintEvent(QPaintEvent * e);

四、paintEvent函数的实现


QFont CreateQFont(bool b)
{
	float size = 9.97386837;//对应的是 420 13
	size = 10;
	if (b)
		size *= 1.2; //对应的是480 16
	//问题就在这里。480不是420的1.2倍
	// 480/420 = 1.1428571428571428571428571428571‬
	
	std::string str = u8"宋体";
	QFont f(str.c_str(), size);
	f.setPointSizeF(size);//当size为float的时候。必须调用这个接口。否则上面构造函数会丢失精度。
	
#ifdef _DEBUG
	auto debugSize = f.pointSizeF();
	auto debugFamily = f.family();
#endif // DEBUG
	
	f.setLetterSpacing(QFont::SpacingType::AbsoluteSpacing, 0);
	return f;
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
	int nFlag = Qt::AlignTop | Qt::AlignLeft;
	
    QString str = "012345678901234567890123456789012345678901234567890123456789";//60个数字
	
	QRectF measureRect, boundingRect;// 函数结束后。左边两个变量会完全相等。但是长度是420
	{
		QRectF rect(0, 0, 10000, 10000);
		painter.setFont(CreateQFont(true));
		measureRect = painter.boundingRect(rect, nFlag, str);
		painter.drawText(rect, nFlag, str, &boundingRect);
	}

	QRectF measureRect2, boundingRect2; // 函数结束后。左边两个变量会完全相等。但是长度是480
	{
		QRectF rect(0, 16, 10000, 10000);// 设置16 是为了绘制在第一次下面,防止重叠
		painter.setFont(CreateQFont(false));
		measureRect2 = painter.boundingRect(rect, nFlag, str);
		painter.drawText(rect, nFlag, str, &boundingRect2);
	}

	return;
}

五、得出结论

设置的文字大小倍数是1.2倍。但是绘制出的结果并不是1.2倍。详情如下表格。

 QFont::pointsizeF绘制的大小(长、宽)
19.97386837

420、13

19.97386837 * 1.2480、16
210420、13
212480、16

很明显480并不是420的1.2倍

480/420 = 1.142857142857142857142857

QT绘制文字大小和QFont字体大小并不是线性相关的。

具体是什么关系,我还没查找到。这个要看qt绘制文字的核心算法

六、注意

如果你跟着前面步骤无法创建成功。你也可以查看附件。然后根据我写的附件下载相关代码。

2019年12月31日 18点52分上传 testQFont.rar

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐