news 2026/7/4 8:00:31

Qt——文本绘制技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt——文本绘制技巧

1.QPainter拥有绘制文本的能力

  • drawText(拥有多个重载形式)
  • 常见调用方式
    • p.drawText(10, 10, "hello");
      • 在坐标(10,10)处绘制文本
    • p.drawText(0, 0, 100, 30, Qt::AlignCenter, "hello")
      • 在矩形范围(0,0,100,30)中以居中对齐的方式绘制文本

2.文本绘制参数

  • 字体(QFont),颜色(QColor)
    • 控制文本大小、风格、颜色等
  • 坐标(QPoint),角度(rotate)
    • 文本绘制的位置(对齐该坐标)
    • 以绘制坐标为圆心顺时针旋转

Widget.h

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> class Widget : public QWidget { Q_OBJECT protected: void paintEvent(QPaintEvent *); public: explicit Widget(QWidget *parent = nullptr); ~Widget() override; }; #endif // WIDGET_H

Widget.cpp

#include "Widget.h" #include <QPainter> Widget::Widget(QWidget *parent) : QWidget(parent) { } void Widget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.save(); //保存之前的状态(颜色、字体、角度) painter.setPen(Qt::black); painter.setFont(QFont("Arial", 16)); painter.rotate(0); painter.drawText(30, 40, "Hello"); painter.setPen(Qt::red); painter.setFont(QFont("Comic Sans MS", 20)); painter.rotate(20); painter.drawText(30, 40, "Hello"); painter.restore(); //恢复保存时的状态 painter.drawText(130, 140, "hello"); } Widget::~Widget() = default;

运行结果:

3.示例:绘制一个字体从屏幕中间慢慢放大的效果

步骤:

  • 在主窗口中绘制文本
  • 将文本中心绘制于窗口中心(width()/2, height()/2)
  • 动画效果通过连续控制字体参数完成(Font)
  • 通过计时器强行更新文本绘制(QTimer)

小技巧:通过QFontMetrics获取字符串在指定字体下的宽度和高度

//指定字体
QFontMetrics metrics(font);
//获取指定字体下相应字符串宽度
int w = metrics.width(text);
//获取指定字体的字符高度
int h = metrics.height();

所以坐标计算为:x = width/2 - w/2 y = height/2 - h/2

Widget.h

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTimer> class Widget : public QWidget { Q_OBJECT int m_sizeFactor; QTimer m_timer; protected slots: void onTimeout(); protected: void paintEvent(QPaintEvent* ); public: explicit Widget(QWidget *parent = nullptr); ~Widget() override; }; #endif // WIDGET_H

Widget.cpp

#include "Widget.h" #include <QPainter> #include <QFontMetrics> #include <QPoint> #include <QFont> #include <QRect> Widget::Widget(QWidget *parent) : QWidget(parent) { m_sizeFactor = 0; m_timer.setParent(this); connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimeout())); //定时器启动后,每 50ms 触发一次 timeout 信号,调用一次 onTimeout () m_timer.start(50); } void Widget::onTimeout() { update(); } void Widget::paintEvent(QPaintEvent* ) { QPainter painter; const QString text = "Hello"; QFont font("Comic Sans MS", 5 + (m_sizeFactor++) % 100); //用来计算当前字体下文字的实际宽、高 QFontMetrics metrics(font); const int w = metrics.width(text); const int h = metrics.height(); // 计算文字绘制矩形位置:水平居中、竖直居中,矩形宽高等于文字宽高 QRect rect((width()-w)/2, (height()-w)/2, w, h); // 指定绘图设备为当前窗口 this,正式开始绘图 painter.begin(this); painter.setPen(Qt::blue); painter.setFont(font); painter.drawText(rect, Qt::AlignCenter, text); painter.end(); } Widget::~Widget() = default;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 7:57:14

中餐厅摆台 点击UI图片拖拽预制体到桌面并 实现预制体拖拽

1、准备桌面 和 酒杯先在Scene窗口中调好相对位置&#xff0c;然后将酒杯拖拽到project目录中生成预制体。需要给预制体增加一个脚本就是 using UnityEngine; public class ItemHeight : MonoBehaviour {// 在预制体Inspector手动填好&#xff1a;这个物品放在桌面需要的世界Yp…

作者头像 李华
网站建设 2026/7/1 1:46:44

go ethereum之p2p

简介 p2p是以太坊节点网络层的骨架&#xff0c;夹在底层 TCP/UDP 和应用协议&#xff08;eth、snap、les&#xff09;之间&#xff0c;管三件事&#xff1a;节点发现&#xff08;谁在线&#xff09;、连接管理&#xff08;怎么连上、怎么断&#xff09;、消息多路复用&#xff…

作者头像 李华
网站建设 2026/7/1 1:45:50

第二次小学期作业

Xshell 和 Xftp 使用教程 Xshell 是一款SSH客户端&#xff0c;用于远程连接并管理Linux服务器。使用步骤&#xff1a; 安装与启动&#xff1a;下载安装Xshell并启动。新建会话&#xff1a;点击“文件” -> “新建”。填写连接信息&#xff1a;在“连接”中&#xff0c;协议选…

作者头像 李华
网站建设 2026/7/1 1:45:42

书法资源合集

萝卜练字 小学生硬笔书法课 文件大小: 44.3GB内容特色: 44.3GB高清视频逐字示范&#xff0c;小学生硬笔书法全流程训练适用人群: 小学生、家长、书法启蒙教师核心价值: 掌握正确握笔与笔画结构&#xff0c;快速提升书写工整度下载链接: https://pan.quark.cn/s/77888772fddb …

作者头像 李华
网站建设 2026/7/1 1:44:53

为什么不该用 Double 表示金额及解决方案合集 - Java(45)

比如 0.1 0.2 并不等于 0.3,而是等于 0.30000000000000004——这也一度成为程序员圈子里的经典梗。所以用浮点数表示金额这种需要精确计算的数值,是会出现精度丢失问题的。double a 0.1; double b 0.2; System.out.println(a b); // 输出: 0.30000000000000004 System.out…

作者头像 李华
网站建设 2026/7/1 1:44:42

面向切面编程和面向对象编程的区别,两者有冲突吗?

面向切面编程&#xff08;AOP&#xff09;和面向对象编程&#xff08;OOP&#xff09;是两种不同的编程范式&#xff0c;它们各自解决不同类型的问题&#xff0c;并且通常可以互补使用而不是冲突。OOP 关注的是对象和它们的交互&#xff0c;强调的是数据和行为的封装。 AOP关注…

作者头像 李华