简述

前面我们讲解了Qt图形的基本绘制,其中包括: 绘制文本、直线、直线、矩形、弧线、椭圆、多边形、图片,以及其它一些高级用法,比如:渐变、转换等。

本节我们来详细讲解文字的绘制。主要通过QPainter的darwText()函数来实现,里面包含多个重载函数,其中,可以通过QRect来指定绘制的区域,也可以通过QPoint来指定绘制的起始点。

QFont类可以辅助设置文本的大小、粗细、字符间距等,然后使用setFont()来设置。

QFontInfo类用来获取字体的信息,可以通过fontInfo()函数来获取。

也可以使用更多其它辅助类来实现更好的效果,比如:QTextOption、QFontMetrics。其中QTextOption可以对文本换行,并设置换行方式以及文本显示方向等效果。QFontMetrics可以计算文本长度,进行特殊处理(比如:显示…)。

基本绘制

效果

源码

  1. void MainWindow::paintEvent(QPaintEvent *event)
  2. {
  3. Q_UNUSED(event);
  4. QPainter painter(this);
  5. // 设置画笔颜色
  6. painter.setPen(QColor(0, 160, 230));
  7. // 绘制区域为当前界面的整个区域(默认-左上角开始)
  8. painter.drawText(rect(), QStringLiteral("一去丶二三里"));
  9. // 绘制区域从x坐标100,y坐标100处开始
  10. painter.drawText(100, 100, QStringLiteral("青春不老,奋斗不止!"));
  11. // 绘制区域从坐标点(20, 200)处开始
  12. painter.drawText(QPoint(20, 200), QStringLiteral("纯正开源之美,有趣、好玩、靠谱。。。"));
  13. }

drawText的重载函数比较,这里我们先介绍常用的几种绘制方式。

文本位置

效果

源码

  1. void MainWindow::paintEvent(QPaintEvent *event)
  2. {
  3. Q_UNUSED(event);
  4. QPainter painter(this);
  5. // 设置画笔颜色
  6. painter.setPen(QColor(0, 160, 230));
  7. // 绘制区域为当前界面的整个区域(居中)
  8. painter.drawText(rect(), Qt::AlignCenter, QStringLiteral("一去丶二三里"));
  9. }

从前面来看,无论我们使用哪种方式,首先都需要控制文本的绘制区域-QRect或起始点QPoint,然后可以根据对齐方式来辅助控制位置的显示-左对齐、右上对齐、居中对齐等。

显示不全

下面,我们先来看一个显示不全的效果图。

效果

源码

  1. void MainWindow::paintEvent(QPaintEvent *event)
  2. {
  3. Q_UNUSED(event);
  4. QPainter painter(this);
  5. // 设置画笔颜色
  6. painter.setPen(QColor(0, 160, 230));
  7. painter.drawText(rect(), Qt::AlignCenter, QStringLiteral("青春不老,奋斗不止!-纯正开源之美,有趣、好玩、靠谱。。。"));
  8. }

有时,我们会出现类似情况,显示不全,这时我们很烦恼,没关系,我们可以使用文本选项QTextOption来换行,也可以使用QFontMetrics来显示…。

QTextOption

效果

源码

  1. void MainWindow::paintEvent(QPaintEvent *event)
  2. {
  3. Q_UNUSED(event);
  4. QPainter painter(this);
  5. // 设置画笔颜色
  6. painter.setPen(QColor(0, 160, 230));
  7. QTextOption option(Qt::AlignLeft | Qt::AlignVCenter);
  8. option.setWrapMode(QTextOption::WordWrap);
  9. painter.drawText(rect(), QStringLiteral("青春不老,奋斗不止!-纯正开源之美,有趣、好玩、靠谱。。。"), option);
  10. }

文本过长,QTextOption可以帮助我们换行,也可以设置对齐方式,除此以外,还可以设置换行方式以及文本显示方向等效果。

QFontMetrics

效果

源码

  1. void MainWindow::paintEvent(QPaintEvent *event)
  2. {
  3. Q_UNUSED(event);
  4. QPainter painter(this);
  5. // 设置画笔颜色
  6. painter.setPen(QColor(0, 160, 230));
  7. QFontMetrics fm = painter.fontMetrics();
  8. QString strText = QStringLiteral("青春不老,奋斗不止!-纯正开源之美,有趣、好玩、靠谱。。。");
  9. QString strElidedText = fm.elidedText(strText, Qt::ElideRight, 200, Qt::TextShowMnemonic);
  10. painter.drawText(rect(), Qt::AlignCenter, strElidedText);
  11. }

如果文本过长,我们又不想换行,只想把其中一部分省略为…,那么我们可以通过QFontMetrics来实现。这里,当长度超过200px时,对文本右侧设置…。

字体

效果

源码

  1. void MainWindow::paintEvent(QPaintEvent *event)
  2. {
  3. Q_UNUSED(event);
  4. QPainter painter(this);
  5. QTransform transform;
  6. transform.rotate(45);
  7. // 设置画笔颜色
  8. painter.setPen(QColor(0, 160, 230));
  9. QFont font;
  10. font.setFamily("Microsoft YaHei");
  11. // 大小
  12. font.setPointSize(16);
  13. // 斜体
  14. font.setItalic(true);
  15. // 设置下划线
  16. font.setUnderline(true);
  17. // 设置上划线
  18. font.setOverline(true);
  19. // 设置字母大小写
  20. font.setCapitalization(QFont::SmallCaps);
  21. // 设置字符间距
  22. font.setLetterSpacing(QFont::AbsoluteSpacing, 20);
  23. // 使用字体
  24. painter.setFont(font);
  25. // 获取字体信息
  26. QFontInfo info = painter.fontInfo();
  27. info.family();
  28. info.italic();
  29. // 转换
  30. painter.setTransform(transform);
  31. painter.drawText(rect(), QStringLiteral("一去丶二三里"));
  32. }

通过QFont我们可以很轻易的设置文本的大小、字体间距等效果,再根据fontInfo()来获取字体信息QFontInfo。当然,我们也可以添加更多效果,比如:通过QTransform来实现转换,这里我们旋转了45度。

Qt之图形(绘制文本)的更多相关文章

  1. QT 基本图形绘制

    QT 基本图形绘制 1.告诉绘制引擎一些东西 QPainter::Antialiasing 在可能的情况下,反锯齿       QPainter::TextAntialiasing 在可能的情况下,文 ...

  2. Qt 2D绘图之一:基本图形绘制和渐变填充

    Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.它们三者的关系如下图所示: QP ...

  3. Qt之图形(绘制漂亮的圆弧)

    简述 综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制. 简述 圆形 效果 源码 弧形 效果 源码 文本 效果 源码 旋转 效果 源码 圆形 经常地,我 ...

  4. Qt绘制文本一

    QPainterPath,使用 drawText且设置字体,再使用painter.drawText方式 效果图: void WgtText::paintEvent(QPaintEvent *event ...

  5. Qt之图形(QPainter的基本绘图)

    简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行 ...

  6. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  7. 推荐12个最好的 JavaScript 图形绘制库

    众多周知,图形和图表要比文本更具表现力和说服力.图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web  ...

  8. 基于SVG的web页面图形绘制API介绍

    转自:http://blog.csdn.net/jia20003/article/details/9185449 一:什么是SVG SVG是1999由W3C发布的2D图形描述语言,纯基于XML格式的标 ...

  9. 图形绘制 Canvas Paint Path 详解

    图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...

随机推荐

  1. Springboot设置跨域的三种方式

    方式一(精细配置) 在需要跨域的整个Controller或者单个方法上添加@CrossOrigin注解 方式二(全局配置) @Configuration public class WebMvcConf ...

  2. vector迭代器

    https://www.cnblogs.com/quant-lee/p/6618829.html

  3. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

  4. electron 新手教程 打包 exe

    1.安装nodejs(会自动安装npm) 2.桌面新建文件夹    your-app  (下面目录结构) your-app/ ├── package.json ├── main.js └── inde ...

  5. Vir-manager 创建虚拟机

  6. 原创全新打包工具Parcel零配置VueJS开发脚手架

    parcel-vue 一个基于Parcel打包工具的 VueJS急速开发脚手架解决方案,强烈建议使用node8.0以上 项目地址: https://github.com/w3c-king/p... 初 ...

  7. POJ——T3352 Road Construction

    http://poj.org/problem?id=3352 vis表示访问的次序 low的值相同的点在同一连通分量 #include <algorithm> #include <c ...

  8. [Angular] Configure an Angular App at Runtime

    It always again happens (especially in real world scenarios) that you need to configure your Angular ...

  9. glm编译错误问题解决 formal parameter with __declspec(align(&#39;16&#39;)) won&#39;t be aligned

    參考:http://stackoverflow.com/questions/25300116/directxxmmatrix-error-c2719-declspecalign16-wont-be-a ...

  10. Android4.2.2下Stagefright下OMX编解码器组件的控制流

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流. qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Version ...