QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem,继上一章节讲过qt中如何编译freetype

Qt编译和使用freetype矢量字库方法icon-default.png?t=N7T8https://blog.csdn.net/wangningyu/article/details/138927379#QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段,结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName){HDC hDC;int iBits;WORD wBitCount; DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize_qt freetypehttps://blog.csdn.net/wangningyu/article/details/109743104MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法-CSDN博客文章浏览阅读239次。【代码】MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法。https://blog.csdn.net/wangningyu/article/details/138802620

这里将不使用qt默认的QGraphicsSimpleTextItem与QGraphicsTextItem实现一下自定义的文字图形类:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QGridLayout>
#include <QPushButton>#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QDebug>
#include <QPainter>
#include <QFont>
#include <QString>
#include <QColor>
#include <QTextDocument>
#include <ft2build.h>
#include FT_FREETYPE_Hclass QxFreeTypeTextItem : public QGraphicsItem
{
public:QxFreeTypeTextItem(const QString& text, int fontSize, const QString& ttfFile, const QColor& textColor, QGraphicsItem* parent = nullptr): QGraphicsItem(parent), m_strText(text), m_iFontSize(fontSize), m_strTtfFile(ttfFile), m_textColor(textColor){m_ftLibrary = NULL;m_ftFace = NULL;if (FT_Init_FreeType(&m_ftLibrary)){qDebug() << "FT_Init_FreeType failed.";return;}if (FT_New_Face(m_ftLibrary, m_strTtfFile.toStdString().c_str(), 0, &m_ftFace)){qDebug() << "FT_New_Face failed: " << m_strTtfFile;return;}FT_Set_Pixel_Sizes(m_ftFace, 0, m_iFontSize);}~QxFreeTypeTextItem(){if(m_ftFace){FT_Done_Face(m_ftFace);m_ftFace = NULL;}if(m_ftLibrary){FT_Done_FreeType(m_ftLibrary);m_ftLibrary = NULL;}}QRectF boundingRect() const override{return m_rect;}void setRect(qreal left, qreal top, qreal width, qreal height){m_rect = QRectF(left, top, width, height);update();}void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override{int x = m_rect.left();int y = m_rect.top();Q_UNUSED(option);Q_UNUSED(widget);// 开始利用freetype绘制文字painter->setRenderHint(QPainter::Antialiasing);painter->setPen(m_textColor);for (int i = 0; i < m_strText.length(); ++i){QChar   ucode = m_strText.at(i);ushort  unicode = ucode.unicode();if (FT_Load_Char(m_ftFace, unicode, FT_LOAD_RENDER)){continue;}FT_GlyphSlot    glyph = m_ftFace->glyph;QImage          glyphImage(glyph->bitmap.width, glyph->bitmap.rows, QImage::Format_ARGB32);glyphImage.fill(Qt::transparent);for (unsigned int j = 0; j < glyph->bitmap.rows; ++j){for (unsigned int k = 0; k < glyph->bitmap.width; ++k){int alpha = glyph->bitmap.buffer[j * glyph->bitmap.width + k];glyphImage.setPixel(k, j, qRgba(m_textColor.red(), m_textColor.green(), m_textColor.blue(), alpha));}}painter->drawImage(QPointF(x + glyph->bitmap_left, y - glyph->bitmap_top), glyphImage);x += (glyph->advance.x >> 6);}}private:QString     m_strText;int         m_iFontSize;QString     m_strTtfFile;QColor      m_textColor;FT_Library  m_ftLibrary;FT_Face     m_ftFace;QRectF      m_rect;
};MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QGraphicsScene  *pScene = new QGraphicsScene(this);pScene->setSceneRect(QRect(0, 0, 800, 500));ui->graphicsView->setScene(pScene);ui->graphicsView->setRenderHint(QPainter::Antialiasing);//ui->graphicsView->setCacheMode(QGraphicsView::CacheBackground);//ui->graphicsView->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);ui->graphicsView->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);ui->graphicsView->setMouseTracking(true);ui->graphicsView->setStyleSheet(QString("background:%1").arg(QColor(255, 255, 176).name()));QColor              clr(0, 0, 255);QxFreeTypeTextItem  *pItem = new QxFreeTypeTextItem("FreeType: Hello-Normal by wangningyu", 32, "C:/ArialUMS.TTF", clr);pItem->setRect(10, 10, 300, 100);pItem->setFlag(QGraphicsItem::ItemIsMovable, true);pItem->setFlag(QGraphicsItem::ItemIsSelectable, true);pScene->addItem(pItem);pItem = new QxFreeTypeTextItem("FreeType: Hello-Bold by wangningyu", 32, "C:/Windows/Fonts/Arialbd.ttf", clr);pItem->setRect(10, 50, 300, 100);pItem->setFlag(QGraphicsItem::ItemIsMovable, true);pItem->setFlag(QGraphicsItem::ItemIsSelectable, true);pScene->addItem(pItem);pItem = new QxFreeTypeTextItem("FreeType: Hello-Italic by wangningyu", 32, "C:/Windows/Fonts/Ariali.ttf", clr);pItem->setRect(10, 90, 300, 100);pItem->setFlag(QGraphicsItem::ItemIsMovable, true);pItem->setFlag(QGraphicsItem::ItemIsSelectable, true);pScene->addItem(pItem);pItem = new QxFreeTypeTextItem("FreeType: Hello-Bold-Italic by wangningyu", 32, "C:/Windows/Fonts/Arialbi.ttf", clr);pItem->setRect(10, 130, 300, 100);pItem->setFlag(QGraphicsItem::ItemIsMovable, true);pItem->setFlag(QGraphicsItem::ItemIsSelectable, true);pScene->addItem(pItem);
}MainWindow::~MainWindow()
{delete ui;
}

测试效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】SpringBoot3-基本介绍

目录 环境基本介绍pom.xml启动器依赖管理机制分析为什么导入starter-web所有相关依赖都导入进来&#xff1f;为什么版本号都不用写&#xff1f;自定义版本号第三方的依赖 总结 自动配置机制理解默认的包扫描规则配置默认值按需加载自动配置总结 自动配置流程问题流程步骤流程总…

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…

沃尔玛自建自养号测评的优势,提升产品排名的新选择

在沃尔玛平台上&#xff0c;产品排名和销量的提升对于卖家而言至关重要&#xff0c;而产品测评则是实现这一目标的有效途径。然而&#xff0c;市场上对于测评的需求激增&#xff0c;随之而来的是寻找测评服务的种种困难和风险。因此&#xff0c;越来越多的卖家选择自建自养号测…

cdn引入vue的项目嵌入vue组件——http-vue-loader 的使用——技能提升

最近在写MVC的后台&#xff0c;看到全是jq的写法&#xff0c;但是对于用惯了vue的我&#xff0c;真是让我无从下手。。。 vue的双向绑定真的很好用。。。 为了能够在cdn引入的项目中嵌入vue组件&#xff0c;则可以使用http-vue-loader了 步骤1&#xff1a;下载http-vue-loader…

使用TerraScan静态扫描KubernetsIaC文件

terrascan https://github.com/tenable/terrascan Terrascan 是基础架构即代码的静态代码分析器。Terrascan 允许&#xff1a; 将基础架构作为代码无缝扫描&#xff0c;以查找错误配置。监控已配置的云基础架构&#xff0c;以查找引入终端安全评估漂移的配置更改&#xff0…

10个必备功能跨境电商ERP开发全指南

跨境电商平台开发是当前电商行业的热门话题。随着全球贸易的不断发展&#xff0c;企业越来越关注并重视跨境电商ERP系统的开发和应用。在本文中&#xff0c;我们将深入探讨跨境电商ERP开发的必备功能&#xff0c;为您呈现全面的指南。 1. 跨境订单管理 跨境电商平台需要具备全…

go语言中Print,Printf和Println的区别

Print是Golang的fmt包中的内置函数&#xff0c;使用其操作数的默认格式打印格式并写入标准输出&#xff1b; Println是Golang的fmt包中的内置函数&#xff0c;用于在结尾处打印带有新行的消息到控制台。它需要零个或多个任意类型的参数&#xff0c;并使用空格分隔它们&#xff…

CST电磁仿真软件什么是Schematic?三维模型和电路协同仿真【小白必学教程】

什么是Schematic? 使用CST Design Studio进行的各种分析&#xff01; Schematic 进行三维仿真时&#xff0c;有时需要将3D模型和电路图放在一起进行仿真分析。比如需要天线和匹配电路协同仿真&#xff0c;两者构成完整的电路图可以系统地分析In/0ut特性。按下3D工作界面下方…

docker本地(非公网)搭建gpt-4-all 和 GPTS 多模态对话页面(支持Chat Gpt4o「omni」)

文章目录 GPT-4o简介API-key的获取Linux环境部署gpt-4-all 和 GPTS 多模态访问测试 GPT-4o简介 新模型 GPT-4o&#xff0c;其中的「o」代表「omni」&#xff08;即全面、全能的意思&#xff09;&#xff0c;这个模型同时具备文本、图片、视频和语音方面的能力 API-key的获取 …

在Ubuntu22.04搭建xfce远程桌面

由于Ubuntu22.04云服务器&#xff08;带GPU&#xff09;只开放部分端口&#xff0c;某些服务&#xff08;如nacos&#xff09;有Web前端需要访问&#xff0c;但是相应的端口并没有开放&#xff0c;只有SSH端口可以使用。于是&#xff0c;就在Ubuntu22.04上安装xfce桌面环境&…

JavaScript对象设计哲学:八种模式塑造高效代码

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言 &#x1f680;二、Object 构造函数 &#x1f9f1;&#x1f4cc; 基本用法&#x1f4cc; 重要性&#x1f4cc; 实际应用案例 三、对象字面量 &#x1f4d8;&#x1f4cc; 定义属性&#x1f4cc; 定义方法&#x1f4…

2023年数维杯国际大学生数学建模挑战赛D题洗衣房清洁计算解题全过程论文及程序

2023年数维杯国际大学生数学建模挑战赛 D题 洗衣房清洁计算 原题再现&#xff1a; 洗衣房清洁是人们每天都要做的事情。洗衣粉的去污作用来源于一些表面活性剂。它们可以增加水的渗透性&#xff0c;并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分子的存在&#xff…

如何修改照片的dpi值?在线图片更改dpi快捷方法

不少小伙不知道如何去改变图片分辨率&#xff0c;因为能用的到分辨率dpi的地方也不多&#xff0c;但是当我们在求职、考公或者是打印照片的时候&#xff0c;就经常看到会要求图片分辨率为300dpi以上了&#xff0c;本文将分享一款图片处理工具&#xff0c;它能快速完成修改图片分…

Vue3专栏项目 -- 三、使用vue-router 和 vuex(上)

前面我们开发了两个页面的组件&#xff0c;现在我们需要把它们分成几个页面了&#xff0c;那么一个网页多个页面我们都熟悉&#xff0c;针对不同的url渲染不同的html静态页面&#xff0c;这是web世界的基本工作方式。 有时候我们点击一个东西&#xff0c;地址栏的路由跳转&…

DOS学习-目录与文件应用操作经典案例-dir

欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.练习 一.前言 dir是"directory"&#xff08;目录&#xff09;的缩写&#xff0c;它主要用于展示某个磁盘上的全部或特定文件目录。在DOS操作系统中&#…

【前段】开发五子棋小游戏全流程

使用前端技术开发五子棋小游戏 在这篇博文中&#xff0c;我们将详细介绍如何使用HTML、CSS和JavaScript开发一个简单的五子棋小游戏。我们将展示如何初始化棋盘、处理用户交互以及实现胜负判定。特别是&#xff0c;我们将着重介绍胜负判定的逻辑实现。 完整代码我放在了这里&a…

push to origin/master was rejected解决方案之一

如果你是git小白&#xff0c;并且其他帖子的方法都不行&#xff0c;可以一试 在你的远程库&#xff08;我这个是gitee&#xff09;设置中的邮箱设置里不勾这个选项 然后就没有然后了。

宣布推出 Search AI Lake 和 Elastic Cloud Serverless 以扩展低延迟搜索

作者&#xff1a;来自 Elastic Ken Exner 今天&#xff0c;我们很高兴地宣布 Search AI Lake 和 Elastic Cloud Serverless。 Search AI Lake 是一种针对实时应用程序进行优化的开创性云原生架构&#xff0c;它将扩展的存储容量与低延迟查询以及 Elasticsearch 强大的搜索和 AI…

视频监控平台智能边缘分析一体机视频存储平台打手机检测算法

智能边缘分析一体机的打手机检测算法是一种集成了先进图像处理、计算机视觉和人工智能技术的解决方案&#xff0c;专门用于实时监测和识别监控场景中的打手机行为。 在提到“打手机检测算法”时&#xff0c;可能是指一种能够识别和检测使用手机行为的算法。这种算法可以应用于多…

力扣HOT100 - 300. 最长递增子序列

解题思路&#xff1a; 动态规划 class Solution {public int lengthOfLIS(int[] nums) {if (nums.length 0) return 0;int[] dp new int[nums.length];int max 0;Arrays.fill(dp, 1);for (int i 0; i < nums.length; i) {for (int j 0; j < i; j) {if (nums[j] <…