Qt中QPainter實(shí)現(xiàn)繪制文本功能的示例代碼
QPainter擁有繪制文本的能力
drawText(擁有多個(gè)重載形式)
常見(jiàn)調(diào)用方式
- p.drawText(10, 10, "hello"):在坐標(biāo)(10,10)處繪制文本
- p.drawText(0, 0, 100, 30, Qt::AlignCenter, "hello"):在矩形范圍(0,0,100,30)中以居中對(duì)齊的方式繪制文本
文本繪制參數(shù)
字體(QFont),顏色(QColor):控制文本大小、風(fēng)格、顏色等
坐標(biāo)(QPoint),角度(rotate)
- 文本繪制的位置(對(duì)齊該坐標(biāo))
- 以繪制坐標(biāo)為圓心順時(shí)針旋轉(zhuǎn)
完整代碼
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(); //保存之前的狀態(tài)(顏色、字體、角度)
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(); //恢復(fù)保存時(shí)的狀態(tài)
painter.drawText(130, 140, "hello");
}
Widget::~Widget() = default;運(yùn)行結(jié)果:

示例:繪制一個(gè)字體從屏幕中間慢慢放大的效果
步驟:
- 在主窗口中繪制文本
- 將文本中心繪制于窗口中心(width()/2, height()/2)
- 動(dòng)畫效果通過(guò)連續(xù)控制字體參數(shù)完成(Font)
- 通過(guò)計(jì)時(shí)器強(qiáng)行更新文本繪制(QTimer)
小技巧:通過(guò)QFontMetrics獲取字符串在指定字體下的寬度和高度
//指定字體 QFontMetrics metrics(font); //獲取指定字體下相應(yīng)字符串寬度 int w = metrics.width(text); //獲取指定字體的字符高度 int h = metrics.height();
所以坐標(biāo)計(jì)算為: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_HWidget.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()));
//定時(shí)器啟動(dòng)后,每 50ms 觸發(fā)一次 timeout 信號(hào),調(diào)用一次 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);
//用來(lái)計(jì)算當(dāng)前字體下文字的實(shí)際寬、高
QFontMetrics metrics(font);
const int w = metrics.width(text);
const int h = metrics.height();
// 計(jì)算文字繪制矩形位置:水平居中、豎直居中,矩形寬高等于文字寬高
QRect rect((width()-w)/2, (height()-w)/2, w, h);
// 指定繪圖設(shè)備為當(dāng)前窗口 this,正式開始繪圖
painter.begin(this);
painter.setPen(Qt::blue);
painter.setFont(font);
painter.drawText(rect, Qt::AlignCenter, text);
painter.end();
}
Widget::~Widget() = default;到此這篇關(guān)于Qt中QPainter實(shí)現(xiàn)繪制文本功能的示例代碼的文章就介紹到這了,更多相關(guān)Qt QPainter繪制文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程
這篇文章主要介紹了Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程 ,需要的朋友可以參考下2020-02-02
QT使用SQLite數(shù)據(jù)庫(kù)超詳細(xì)教程(增刪改查、對(duì)大量數(shù)據(jù)快速存儲(chǔ)和更新)
這篇文章主要給大家介紹了關(guān)于QT使用SQLite數(shù)據(jù)庫(kù)的相關(guān)資料,其中包括增刪改查以及對(duì)大量數(shù)據(jù)快速存儲(chǔ)和更新,SQLite是一種嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它是一個(gè)軟件庫(kù),提供了一個(gè)自包含、無(wú)服務(wù)器、零配置的、事務(wù)性的SQL數(shù)據(jù)庫(kù)引擎,需要的朋友可以參考下2024-01-01

