Qt——文本绘制技巧

📅 2026/7/1 1:47:06
Qt——文本绘制技巧
1.QPainter拥有绘制文本的能力drawText拥有多个重载形式常见调用方式p.drawText(10, 10, hello);在坐标1010处绘制文本p.drawText(0, 0, 100, 30, Qt::AlignCenter, hello)在矩形范围0010030中以居中对齐的方式绘制文本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_HWidget.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/2Widget.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())); //定时器启动后每 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;