目录
QPainter
QPainter 的一些关键步骤和使用方法:
QPainter 的一些常用接口:
1. 基础绘制接口
2. 颜色和画刷设置
3. 图像绘制
4. 文本绘制
5. 变换操作
6. 渲染设置
7. 状态保存与恢复
8. 其它绘制方法
示例代码1:
示例代码2(音乐播放旋转效果):
QPainter
QPainter
是 Qt 提供的一个用于绘图的类。它能够在窗口、图像、打印机等设备上进行绘图操作,可以绘制线条、形状、文字、图像等内容。QPainter
通常在窗口的 paintEvent
中使用。
QPainter
的一些关键步骤和使用方法:
-
在
paintEvent
中使用QPainter
当需要绘图时,一般会重写paintEvent
方法,在此方法中使用QPainter
进行绘图。 -
开始绘图
创建一个QPainter
对象并将其绑定到一个绘图设备(如QWidget
或QImage
)。 -
设置画笔和画刷
可以使用QPen
来设置线条的颜色、宽度、样式等;使用QBrush
设置填充样式。 -
绘制图形
使用QPainter
的绘图方法,比如drawLine()
、drawRect()
、drawText()
、drawEllipse()
、drawImage()
等。 -
结束绘图
QPainter
使用结束后,需要调用end()
或让QPainter
对象自动析构。
QPainter
的一些常用接口:
QPainter 是 Qt 中的一个关键类,用于在窗口、小部件或图像上绘制图形。它提供了丰富的接口来绘制各种图形元素,如直线、矩形、圆、文本和图片等。
以下是 QPainter 的一些常用接口和它们的用途。
1. 基础绘制接口
- drawLine(const QPoint &p1, const QPoint &p2):绘制从点 `p1` 到点 `p2` 的直线。
painter.drawLine(QPoint(10, 10), QPoint(100, 100));
- drawRect(int x, int y, int width, int height):绘制一个矩形,指定位置和尺寸。
painter.drawRect(20, 20, 100, 50);
- drawEllipse(int x, int y, int width, int height):绘制一个椭圆或圆,指定左上角和尺寸。
painter.drawEllipse(50, 50, 80, 80);
- drawPolygon(const QPolygon &polygon):绘制一个多边形,可以通过 `QPolygon` 指定顶点。
QPolygon polygon;
polygon << QPoint(60, 80) << QPoint(90, 20) << QPoint(130, 90);
painter.drawPolygon(polygon);
2. 颜色和画刷设置
- setPen(const QPen &pen):设置画笔,用于线条、边框和文本等的颜色和样式。
QPen pen(Qt::red);
pen.setWidth(2);
painter.setPen(pen);
- setBrush(const QBrush &brush):设置画刷,用于填充图形的颜色或纹理。
painter.setBrush(QBrush(Qt::blue, Qt::SolidPattern));
painter.drawRect(50, 50, 100, 100);
3. 图像绘制
- drawPixmap(int x, int y, const QPixmap &pixmap):在指定位置绘制图像。
QPixmap pixmap(":/images/example.png");
painter.drawPixmap(100, 100, pixmap);
- drawImage(const QRect &rectangle, const QImage &image):在矩形区域内绘制图像,支持更丰富的图像格式(如 JPG、PNG 等)。
QImage image(":/images/example.jpg");
painter.drawImage(QRect(150, 150, 100, 100), image);
4. 文本绘制
- drawText(int x, int y, const QString &text):在指定坐标处绘制文本。
painter.drawText(200, 200, "Hello, Qt!");
- drawText(const QRect &rectangle, int flags, const QString &text):在指定矩形区域内绘制文本,并设置对齐方式。
painter.drawText(QRect(100, 100, 200, 50), Qt::AlignCenter, "Centered Text");
5. 变换操作
- translate(int dx, int dy):平移当前坐标系。
painter.translate(50, 50); // 将原点向右下平移50像素
- rotate(qreal angle):旋转当前坐标系,单位是角度。
painter.rotate(45); // 顺时针旋转45度
- scale(qreal sx, qreal sy):缩放当前坐标系。
painter.scale(1.5, 1.5); // 将坐标系放大1.5倍
6. 渲染设置
- setRenderHint(QPainter::RenderHint hint, bool on = true):设置渲染提示以增强图形效果,例如抗锯齿、平滑等。
painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿
- setOpacity(qreal opacity):设置不透明度,用于实现透明效果,取值范围为 `0.0`(完全透明)到 `1.0`(完全不透明)。
painter.setOpacity(0.5); // 设置50%透明度
7. 状态保存与恢复
save()和 restore():用于保存和恢复 QPainter 的状态。在进行复杂绘图时,这两个方法非常实用,可以在修改设置后轻松恢复原来的状态。
painter.save();
painter.setPen(Qt::red);
painter.drawLine(0, 0, 100, 100);
painter.restore(); // 恢复到原来的设置
8. 其它绘制方法
- drawArc(const QRect &rect, int startAngle, int spanAngle):绘制圆弧。
painter.drawArc(QRect(100, 100, 80, 80), 30 * 16, 120 * 16); // 角度以1/16度为单位
- drawChord(const QRect &rect, int startAngle, int spanAngle):绘制弦形区域(即部分封闭的圆弧)。
painter.drawChord(QRect(150, 150, 80, 80), 30 * 16, 120 * 16);
- drawPie(const QRect &rect, int startAngle, int spanAngle):绘制扇形区域。
painter.drawPie(QRect(200, 200, 80, 80), 45 * 16, 90 * 16);
示例代码1:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent *);
};
#endif // MAINWINDOW_H
mainwindow.c
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
}
MainWindow::~MainWindow() {
}
void MainWindow::paintEvent(QPaintEvent *) {
QPainter painter(this); //this指本窗口
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //设置抗锯齿,流畅转换
// 绘制矩形
painter.setPen(Qt::blue);
painter.setBrush(Qt::yellow);
painter.drawRect(10, 10, 100, 50);
// 绘制圆
painter.setBrush(Qt::green);
painter.drawEllipse(150, 10, 80, 80);
// 绘制文本
painter.setPen(Qt::black);
painter.drawText(50, 150, "Hello, QPainter!");
// 绘制图像
QPixmap pixmap(":/image/cd.png");
painter.drawPixmap(200, 150, pixmap.scaled(80, 80, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
运行效果:
示例代码2(音乐播放旋转效果):
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent *);
private:
QTimer *timer; //定时器
int angle;
private slots:
void timerTimeOut();
};
#endif // MAINWINDOW_H
mainwindow.c
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
angle = 0;
timer = new QTimer(this);
timer->start(100); //定时100ms
connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
}
MainWindow::~MainWindow() {
}
void MainWindow::timerTimeOut() {
this->update();
}
void MainWindow::paintEvent(QPaintEvent *) {
QPainter painter(this); //this指本窗口
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //设置抗锯齿,流畅转换
if (angle++ == 360)
angle = 0;
QPixmap image; // QPixmap类型对象
image.load(":/image/cd.png"); //加载图片
//QRectF即,继承QRect(Qt的矩形类),F代表精确到浮点类型
QRectF rect((this->width() - image.width()) / 2,
(this->height() - image.height()) / 2,
image.width(),
image.height());
painter.translate(0 + rect.x() + rect.width() / 2,
0 + rect.y() + rect.height() / 2);
painter.rotate(angle); //旋转角度
painter.translate(0 - (rect.x() + rect.width() / 2),
0 - (rect.y() + rect.height() / 2));
painter.drawImage(rect, image.toImage(), image.rect());
painter.drawRect(rect.toRect());
}
注:
void MainWindow::timerTimeOut() {
this->update();
}
this->update()是在 Qt 中用于刷新或重绘窗口的一种方法。调用 update() 时,Qt 会将该窗口标记为需要重绘,在下一个事件循环周期触发 paintEvent() 方法,从而重新绘制窗口内容。
QRectF rect((this->width() - image.width()) / 2, (this->height() - image.height()) / 2, image.width(), image.height());
rect
定义了一个矩形区域,其大小等于image
的宽和高,位置设置为窗口的中心位置。(this->width() - image.width()) / 2
和(this->height() - image.height()) / 2
计算出图像居中显示时的左上角坐标。
painter.translate(0 + rect.x() + rect.width() / 2, 0 + rect.y() + rect.height() / 2);
painter.translate()
将QPainter
的原点平移到rect
的中心。rect.x()
和rect.y()
分别是rect
左上角的 x 和 y 坐标,rect.width() /2
和rect.height() / 2
则将坐标移动到rect
的中心位置。
运行效果(每隔100ms图片旋转一次):