目录
1,绘图的基本概念
Qt 提供了画图相关的 API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界⾯设计,这就是 Qt 绘图。绘图 API 核心类如下:
绘图 API 的使用,⼀般不会在 QWidget 的构造函数中使用,而是要放到 paintEvent 事件中。paintEvent 会在以下情况下被触发:
- 控件⾸次创建
- 控件被遮挡,再解除遮挡
- 窗口最小化,再恢复
- 控件大小发⽣变化时
- 主动调用 repaint() 或者 update() 方法。(这两个方法都是 QWidget 的方法)
2,绘制各种形状
绘制线段:
void QPainter::drawLine(const QPoint &p1, const QPoint &p2);
void QPainter::drawLine(int x1, int y1, int x2, int y2);
参数:
p1:绘制起点坐标;p2:绘制终点坐标
x1,y1:绘制起点坐标;x2,y2:绘制终点坐标
绘制矩形:
void QPainter::drawRect(int x, int y, int width, int height);
参数:
x:窗⼝横坐标;
y:窗⼝纵坐标;
width:所绘制矩形的宽度;
height:所绘制矩形的⾼度;
绘制圆:
void QPainter::drawEllipse(const QPoint ¢er, int rx, int ry)
参数:
center:中心点坐标
rx:横坐标
ry:纵坐标
绘制文本:
void QPainter::drawText(int x, int y, const QString& s);
QPainter::drawText() 函数来绘制⽂字,也可 以使⽤QPainter::setFont()设置字体等信息。
参数:
x:窗⼝横坐标;
y:窗⼝纵坐标;
s:文本;
QPainter painter(this);
// 画线段
painter.drawLine(20, 20, 200, 20);
painter.drawLine(QPoint(20, 50), QPoint(200, 50));
// 画矩形
painter.drawRect(50, 80, 100, 80);
// 画一个圆
painter.drawEllipse(50, 170, 50, 50); // 圆形
painter.drawEllipse(50, 250, 80, 50); // 椭圆
// 使用上面设置的painter,绘制⽂本
// 注意:没有画图绘制的文本将没有任何“艺术样式”效果
QFont font("微软雅黑", 20); // 设置字体
painter.setFont(font);
painter.drawText(0, 350, "欢迎来到Qt");
// 或者painter.drawText(QRect(100,200,600,150), "欢迎来到Qt");
3,设置画笔
QPainter在绘制时,是有一个默认的画笔的。在使用时也可以⾃定义画笔。在 Qt 中,QPen类中定义了 QPainter 应该如何绘制形状、线条和轮廓。同时通过 QPen类可以设置画笔的线宽、颜⾊、样式、 画刷等。
画笔的颜⾊可以在实例化画笔对象时进⾏设置,画笔的宽度是通过 setWidth() ⽅法进⾏设置,画笔的⻛格是通过 setStyle() ⽅法进⾏设置,设置画刷主要是通过 setBrush() ⽅法。
设置画笔颜⾊:QPen::QPen(const QColor& color) 画笔的颜⾊主要是通过 QColor 类设置
设置画笔宽度:void QPen::setWidth(int width)
设置画笔⻛格:void QPen::setStyle(Qt::PenStyle style)
画笔的风格有如下:
QPainter painter(this);
// 画一个圆,使用画笔
QPen pen; // 设置画笔
pen.setColor(QColor(255, 0, 0)); // 设置红色的线条
pen.setWidth(5); // 设置画笔的宽度,即粗细
pen.setStyle(Qt::DashLine); // 设置线条的风格
painter.setPen(pen); // 使用画笔风格
painter.drawEllipse(50, 170, 50, 50); // 圆形
painter.drawEllipse(50, 250, 80, 50); // 椭圆
4,设置画刷
在 Qt 中,画刷是使⽤ QBrush类来描述,画刷大多用于填充。QBrush定义了QPainter的填充模式,具有样式、颜色、渐变等属性。
画刷的格式中定义了填充的样式,使⽤ Qt::BrushStyle 枚举,默认值是 Qt::NoBrush,也就是不进行任何填充。可以通过 Qt 助⼿查找画刷的格式。如下图示:
设置画刷主要通过 void QPen::setBrush(const QBrush& brush) 方法,其参数为画刷的格式。
QPainter painter(this);
// 画一个圆,且使用画刷和画笔
// 设置画刷
QBrush brush;
brush.setColor(QColor(0, 255, 0));
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
// 设置画笔
QPen pen;
pen.setColor(QColor(255, 0, 0)); // 设置红色的线条
pen.setWidth(5); // 设置画笔的宽度,即粗细
pen.setStyle(Qt::DashLine); // 设置线条的风格
painter.setPen(pen);
painter.drawEllipse(50, 170, 50, 50); // 圆形
painter.drawEllipse(50, 250, 80, 50); // 椭圆
5,绘制图片
Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap和QPicture。这里只说明QPixmap。QPixmap主要⽤来在屏幕上显示图像,它对在屏幕上显示图像进行了优化。
QPainter 中提供了 drawPixmap 方法设置图片;提供了 translate() 函数来实现坐标原点的改变;提供了 rotate()函数进行旋转。其中,rotate()函数默认是以原点为中心进行旋转的,如果要改变旋转的中心,可以使用 translate()函数完成。
语法:
void QPainter::drawPixmap(int x, int y, int w, int h, const QPixmap& pm);
void QPainter::translate(qreal dx, qreal dy)
void QPainter::rotate(qreal angle)
要旋转的角度angle正值表示顺时针方向旋转,负值表示逆时针方向旋转
样例:
QPainter painter(this);
QPixmap pixmap(":/a.jpg");
// 将绘图设备的坐标系原点 (0, 0) 平移到新的位置 (20, 20), 即重设坐标系
painter.translate(20, 20);
// 图片旋转。本质上是把QPainter对象进行旋转,这样绘制的内容就产生了旋转
painter.rotate(360); // 等于没旋转
// 在(250,100)处绘图,且将图片缩放成400*300
painter.drawPixmap(250, 100, 400, 300, pixmap);
// painter.drawPixmap(250, 100, pixmap); // 在(250,100)处绘图,图片大小等于原本图片大小
painter.translate(100, 100);
下面可再设计其它图形等