文章目录
- 前言
- QPainter 是干什么的
- 如何使用 QPainter
- 在哪个函数使用 QPainter
- 为什么要在这里使用 QPainter
- 最简单的示例代码
- QPainter 函数
- 构造函数与析构函数
- QPainter()
- QPainter(QPaintDevice *device)
- ~QPainter()
- 初始化和结束绘图
- bool begin(QPaintDevice *device)
- bool end()
- 状态保存与恢复
- void save()
- void restore()
- 设置绘图属性
- void setPen(const QPen &pen)
- void setBrush(const QBrush &brush)
- void setFont(const QFont &font)
- void setRenderHint(QPainter::RenderHint hint, bool on = true)
- 绘制操作
- void drawLine(const QPointF &p1, const QPointF &p2)
- void drawRect(const QRectF &rect)
- void drawEllipse(const QRectF &rect)
- void drawText(const QRectF &rect, int flags, const QString &text)
- 更多函数
- 转换操作
- void translate(const QPointF &offset)
- void rotate(qreal angle)
- void scale(qreal sx, qreal sy)
- 绘制Y=Asin (ωx+φ)
- 头文件
- 总结
前言
QPainter 是 Qt 中用于绘制图形和文本的类,广泛应用于自定义控件和绘图应用程序。它提供了一系列丰富的绘图功能,包括绘制基本图形、文本、图像以及路径。理解 QPainter 的使用方式和相关函数,对于提升 Qt 开发技能、创建美观的界面至关重要。
QPainter 是干什么的
QPainter 是一个强大的绘图类,用于在各种设备上进行绘制操作,如窗口、小部件、图像等。它支持丰富的绘图操作,包括绘制直线、矩形、椭圆、多边形、贝塞尔曲线、文本等,还可以进行图像变换和抗锯齿处理。QPainter 通常用于重载 QWidget 的 paintEvent
函数,以实现自定义绘图。
如何使用 QPainter
使用 QPainter 的一般步骤如下:
- 创建 QPainter 对象。
- 开始绘制操作。
- 设置绘图属性(如颜色、笔刷、字体等)。
- 进行绘图操作(如绘制图形、文本等)。
- 结束绘制操作。
在哪个函数使用 QPainter
通常在 QWidget 的 paintEvent
函数中使用 QPainter。paintEvent
是一个虚函数,当需要重新绘制窗口或控件时会被调用。通过在这个函数中使用 QPainter,可以实现自定义的绘图逻辑。
void QWidget::paintEvent(QPaintEvent *event);
为什么要在这里使用 QPainter
在 paintEvent
中使用 QPainter 是因为该函数在窗口需要更新或重绘时被自动调用。通过在这里进行绘图操作,可以确保绘图内容在窗口显示时及时更新,并且可以响应窗口的大小变化、内容变化等事件。
最简单的示例代码
以下是一个简单的示例,展示如何在 QWidget 的 paintEvent
函数中使用 QPainter:
#include <QApplication>
#include <QWidget>
#include <QPainter>
class MyWidget : public QWidget {
Q_OBJECT
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setPen(Qt::black);
painter.setBrush(Qt::blue);
painter.drawRect(10, 10, 100, 100);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyWidget widget;
widget.resize(200, 200);
widget.show();
return app.exec();
}
QPainter 函数
构造函数与析构函数
QPainter()
QPainter();
- 作用:创建一个未初始化的 QPainter 对象。
- 参数:无。
- 返回值:无。
QPainter(QPaintDevice *device)
QPainter(QPaintDevice *device);
- 作用:创建一个 QPainter 对象并初始化为在指定设备上进行绘图。
- 参数:
QPaintDevice *device
:要绘制的设备(如 QWidget、QImage)。
- 返回值:无。
~QPainter()
~QPainter();
- 作用:销毁 QPainter 对象,结束绘图操作。
- 参数:无。
- 返回值:无。
初始化和结束绘图
bool begin(QPaintDevice *device)
bool begin(QPaintDevice *device);
- 作用:开始在指定设备上进行绘图。
- 参数:
QPaintDevice *device
:要绘制的设备。
- 返回值:返回布尔值
true
表示成功,false
表示失败。
bool end()
bool end();
- 作用:结束绘图操作。
- 参数:无。
- 返回值:返回布尔值
true
表示成功,false
表示失败。
状态保存与恢复
void save()
void save();
- 作用:保存当前绘图状态。
- 参数:无。
- 返回值:无。
void restore()
void restore();
- 作用:恢复上一次保存的绘图状态。
- 参数:无。
- 返回值:无。
设置绘图属性
void setPen(const QPen &pen)
void setPen(const QPen &pen);
- 作用:设置绘制图形的画笔。
- 参数:
const QPen &pen
:画笔对象。
- 返回值:无。
void setBrush(const QBrush &brush)
void setBrush(const QBrush &brush);
- 作用:设置绘制图形的画刷。
- 参数:
const QBrush &brush
:画刷对象。
- 返回值:无。
void setFont(const QFont &font)
void setFont(const QFont &font);
- 作用:设置绘制文本的字体。
- 参数:
const QFont &font
:字体对象。
- 返回值:无。
void setRenderHint(QPainter::RenderHint hint, bool on = true)
void setRenderHint(QPainter::RenderHint hint, bool on = true);
- 作用:设置绘图时的渲染提示,如抗锯齿。
- 参数:
QPainter::RenderHint hint
:渲染提示。bool on
:是否启用该提示。
- 返回值:无。
绘制操作
void drawLine(const QPointF &p1, const QPointF &p2)
void drawLine(const QPointF &p1, const QPointF &p2);
- 作用:绘制一条线。
- 参数:
const QPointF &p1
:起点。const QPointF &p2
:终点。
- 返回值:无。
void drawRect(const QRectF &rect)
void drawRect(const QRectF &rect);
- 作用:绘制一个矩形。
- 参数:
const QRectF &rect
:矩形区域。
- 返回值:无。
void drawEllipse(const QRectF &rect)
void drawEllipse(const QRectF &rect);
- 作用:绘制一个椭圆。
- 参数:
const QRectF &rect
:椭圆的外接矩形区域。
- 返回值:无。
void drawText(const QRectF &rect, int flags, const QString &text)
void drawText(const QRectF &rect, int flags, const QString &text);
- 作用:在指定区域内绘制文本。
- 参数:
const QRectF &rect
:文本的绘制区域。int flags
:文本的对齐方式。const QString &text
:要绘制的文本。
- 返回值:无。
更多函数
更多函数请参考Qt帮助文档,他们都是类似的
转换操作
void translate(const QPointF &offset)
void translate(const QPointF &offset);
- 作用:平移坐标系。
- 参数:
const QPointF &offset
:平移的距离。
- 返回值:无。
void rotate(qreal angle)
void rotate(qreal angle);
- 作用:旋转坐标系。
- 参数:
qreal angle
:旋转的角度(单位:度)。
- 返回值:无。
void scale(qreal sx, qreal sy)
void scale(qreal sx, qreal sy);
- 作用:缩放坐标系。
- 参数:
qreal sx
:X 轴的缩放因子。qreal sy
:Y 轴的缩放因子。
- 返回值:无。
绘制Y=Asin (ωx+φ)
我们可以使用 QPainter 绘制一个简单的 sin 曲线。以下示例展示了如何在 QWidget 的 paintEvent
函数中使用 QPainter 绘制 sin 曲线。
头文件
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <cmath>
class SinWidget : public QWidget {
Q_OBJECT
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
// 设置画笔
painter.setPen(Qt::blue);
// 获取绘图区域的尺寸
int width = this->width();
int height = this->height();
// 计算 sin 曲线的绘制点
QPointF points[width];
for (int i = 0; i < width; ++i) {
double x = i;
double y = height / 2 * (1 - std::sin(2 * M_PI * x / width));
points[i] = QPointF(x, y);
}
// 绘制 sin 曲线
painter.drawPolyline(points, width);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
SinWidget widget;
widget.resize(400, 300);
widget.show();
return app.exec();
}
#include "main.moc"
代码详解
- 创建 SinWidget 类:这是一个继承自 QWidget 的类,用于绘制 sin 曲线。
- 重载 paintEvent 函数:在
paintEvent
函数中使用 QPainter 进行绘图。 - 设置画笔颜色:使用
painter.setPen(Qt::blue)
设置绘制 sin 曲线的画笔颜色为蓝色。 - 计算 sin 曲线的绘制点:
- 获取绘图区域的宽度和高度。
- 计算每个 x 坐标对应的 y 坐标,并存储在
points
数组中。这里使用了标准库中的std::sin
函数计算 y 坐标。
- 绘制 sin 曲线:使用
painter.drawPolyline
函数绘制 sin 曲线。
通过以上代码,可以在一个窗口中绘制出一个简单的 sin 曲线。
我们可以把它的振幅和间距调小一点
总结
QPainter 是 Qt 中一个强大而灵活的绘图类,提供了丰富的绘图功能和操作。通过掌握 QPainter 的使用方法和各种函数,可以在 Qt 应用程序中实现自定义的绘图效果,提升用户界面的美观和交互性。希望本篇文章能帮助你更好地理解和使用 QPainter。