当前位置: 首页 > news >正文

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;
http://www.jsqmd.com/news/1099507/

相关文章:

  • 学习一门语言——Python(自学版)
  • 你的输出第一行肯定和我不一样,且每次运行的输出肯定不一样。
  • 乳牙蛀了不用管?避开护牙误区,科学守护孩子恒牙健康
  • info = {“k1“:1,“k2“:“222“,“k3“:“guohan“} 可变类型不可以做字典的键(列表,字典,集合) 因此键可以是整数什么的如 info = {1:2}公
  • 闪迪 x300 2.5-sata
  • 通用二进制协议分析:基于AST的Protobuf动态解析与容错设计
  • — 一款针对 IT 团队开发的文档管理系统,基于 Golang 开发,内置项目管理,用户管理,权限管理等功能,可以用来储存日常接口文档,数据库字典,手册说明等文档。功能特色:
  • 零基础使用VMware虚拟机安装CentOS Linux超详细教程
  • 硬件学习第三天(阅读芯片手册)
  • c语言项目驱动学习--实例化(图书管理)--005-代码对比
  • 基于51单片机RFID车位车库管理系统/RC522读卡/车库收费系统2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • [智能体-612]:AGENTS.md 完整详解(OpenClaw 体系,对应 workspace 里的工作规范文件)
  • 技术速递|通过全新开放数据集,加速研究人员和开发者构建多语言 AI
  • 中餐厅摆台 点击UI图片拖拽预制体到桌面并 实现预制体拖拽
  • 家庭精细化洗护怎么选?海信全家筒·棉花糖 U7S 四筒洗衣机深度体验
  • MHmarkets:把产品理解成本做扎实,更谨慎的使用者更容易感受到的清单
  • 基于STM32单片机甲醛温湿度烟雾火灾报警 空气质量检测PM2系统2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 全国大学真实生活环境一键查询工具(在线免费)
  • Spring MVC的工作流程
  • go ethereum之p2p
  • 59.可跨平台投产!标准 ST 语言 PLC 电机状态机控制完整源码
  • Keepalived简介与工作原理Keepalived是一个基于VRRP协议(虚拟路由冗余协议) 实现的高可用解
  • 买卖股票的最佳时机
  • 23 万 Star 的秘密知识库,运维和安全人员的工具箱
  • 3个步骤让Windows 11重获新生:Win11Debloat系统优化完全指南
  • 一文搞懂巴别鸟版本管理:从历史回溯到冲突解决的完整攻略
  • 基于STM32单片机老人防丢智能拐杖 盲人导航定位跌倒检测设计系统3(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 别只会堆功能!后端业务代码重构实战,告别祖传烂代码
  • App Store Connect CLI 1.5.4 官方版下载(夸克网盘+百度网盘,SHA256校验)
  • Mi-Create:小米穿戴设备表盘设计的完整技术指南与架构解析