Qt中QPainter实现绘制文本功能的示例代码

 更新时间:2026年07月01日 08:51:11   作者:sycmancia  
本文介绍了Qt中QPainter绘制文本的功能及实现动态文本效果的方法,文内涵盖drawText方法多种调用形式,QFont、QColor参数设置等,感兴趣的小伙伴可以跟随小编一起学习一下

QPainter拥有绘制文本的能力

drawText(拥有多个重载形式)

常见调用方式

  • p.drawText(10, 10, "hello"):在坐标(10,10)处绘制文本
  • p.drawText(0, 0, 100, 30,  Qt::AlignCenter, "hello"):在矩形范围(0,0,100,30)中以居中对齐的方式绘制文本

文本绘制参数

字体(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;

运行结果:

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

步骤:

  • 在主窗口中绘制文本
  • 将文本中心绘制于窗口中心(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;

到此这篇关于Qt中QPainter实现绘制文本功能的示例代码的文章就介绍到这了,更多相关Qt QPainter绘制文本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言 解压华为固件的实例代码

    C语言 解压华为固件的实例代码

    这是解压华为固件(update.app)的C语言。。其实这也是我翻115翻出来的。。。
    2013-08-08
  • C++编程中的格式化输出详解

    C++编程中的格式化输出详解

    这篇文章主要介绍了C++编程中的格式化输出详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Visual Studio 2019配置OpenCV4.1.1详细图解教程

    Visual Studio 2019配置OpenCV4.1.1详细图解教程

    这篇文章主要介绍了Visual Studio 2019配置OpenCV4.1.1详细图解教程 ,需要的朋友可以参考下
    2020-02-02
  • C++中名称空间namespace的使用方法示例

    C++中名称空间namespace的使用方法示例

    namespace中文意思是命名空间或者叫名字空间,下面这篇文章主要给大家介绍了关于C++中名称空间namespace使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-12-12
  • QT使用SQLite数据库超详细教程(增删改查、对大量数据快速存储和更新)

    QT使用SQLite数据库超详细教程(增删改查、对大量数据快速存储和更新)

    这篇文章主要给大家介绍了关于QT使用SQLite数据库的相关资料,其中包括增删改查以及对大量数据快速存储和更新,SQLite是一种嵌入式关系型数据库管理系统,它是一个软件库,提供了一个自包含、无服务器、零配置的、事务性的SQL数据库引擎,需要的朋友可以参考下
    2024-01-01
  • C++如何使用new来初始化指向类的指针

    C++如何使用new来初始化指向类的指针

    这篇文章主要介绍了C++如何使用new来初始化指向类的指针问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C语言结构体超详细讲解

    C语言结构体超详细讲解

    C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。你可以认为结构体是一种聚合类型
    2022-04-04
  • C++中string使用+号与int拼接方式

    C++中string使用+号与int拼接方式

    这篇文章主要介绍了C++中string使用+号与int拼接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++堆和栈的区别与联系讲解

    C++堆和栈的区别与联系讲解

    今天小编就为大家分享一篇关于C++堆和栈的区别与联系讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 提升编程能力的C语言技巧总结

    提升编程能力的C语言技巧总结

    这篇文章主要为大家总结了一些C语言技巧的相关资料,可以帮助大家大大提升编程能力。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12

最新评论