admin管理员组文章数量:1030277
《突破控件限制:用Qt绘图API解锁高级界面定制能力》
一、基本概念
虽然 Qt 已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景。很多时候我们需要更强的 “自定制” 能力。
Qt 提供了画图相关的 API,允许我们在窗口上绘制任意的图形形状来完成更复杂的界面设计
- 所谓的 “控件” 本质上也是通过画图的方式画上去的。
- 画图 API 和控件之间的关系,可以类比成机器指令和高级语言之间的关系。
- 控件是对画图 API 的进一步封装,画图 API 是控件的底层实现。
【绘图 API 核心类】
类 | 说明 |
---|---|
QPainter | “绘画者” 或者 “画家” ==> 用来绘图的对象,提供了一系列 drawXXX 方法,可以允许我们绘制各种图形. |
QPaintDevice | “画板” ==> 描述了 QPainter 把图形画到哪个对象上. 像咱们之前用过的 QWidget 也是一种 QPaintDevice (QWidget 是 QPaintDevice 的子类). |
QPen | “画笔” ==> 描述了 QPainter 画出来的线是什么样的. |
QBrush | “画刷” ==> 描述了 QPainter 填充一个区域是什么样的. |
绘图 API 的使用一般不会在 QWidget 的构造函数中使用,而是要放到 paintEvent
事件中,在这里进行调用
paintEvent
会在以下情况下被触发:
- 控件首次创建。
- 控件被遮挡,再解除遮挡。
- 窗口最小化,再恢复。
- 控件大小发生变化时。
- 主动调用
repaint()
或者update()
方法(这两个方法都是 QWidget 的方法)。
二、绘制各种形状
1. 绘制线段
代码语言:javascript代码运行次数:0运行复制void drawLine(const QPoint &p1, const QPoint &p2);
参数:
p1:绘制起点坐标
p2:绘制终点坐标
void drawLine ( int x1, int y1, int x2, int y2 );
参数:
x1,y1:绘制起点坐标
x2,y2:绘制终点坐标
【案例】
在 “widget.h” 头文件中声明绘图事件,然后在 “widget.cpp” 文件中重写 paintEvent()
方法,代码如下:
void Widget::paintEvent(QPaintEvent *event)
{
(void) event;
// 绘图工作就会放到这里来执行.
QPainter painter(this);
// 画一个线段.
painter.drawLine(20, 20, 200, 20);
painter.drawLine(QPoint(20, 100), QPoint(200, 100));
painter.drawLine(20, 20, 100, 300);
}
实现效果如下:
2. 绘制矩形
代码语言:javascript代码运行次数:0运行复制void QPainter::drawRect(int x, int y, int width, int height);
参数:
x:窗口横坐标;
y:窗口纵坐标;
width:所绘制矩形的宽度;
height:所绘制矩形的⾼度;
【案例】:和绘制线段操作类似,代码如下:
代码语言:javascript代码运行次数:0运行复制void Widget::paintEvent(QPaintEvent *event)
{
(void) event;
QPainter painter(this);
// 画一个矩形.
painter.drawRect(100, 100, 300, 200);
}
运行程序,如下:
3. 绘制圆形
代码语言:javascript代码运行次数:0运行复制void QPainter::drawEllipse(const QPoint ¢er, int rx, int ry)
参数:
center:中⼼点坐标
rx:横坐标
ry:纵坐标
【案例】:和上面类似,如下:
代码语言:javascript代码运行次数:0运行复制// 画圆形.
painter.drawEllipse(200, 200, 400, 100);
运行程序,如下:
4. 绘制文本
《突破控件限制:用Qt绘图API解锁高级界面定制能力》
一、基本概念
虽然 Qt 已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景。很多时候我们需要更强的 “自定制” 能力。
Qt 提供了画图相关的 API,允许我们在窗口上绘制任意的图形形状来完成更复杂的界面设计
- 所谓的 “控件” 本质上也是通过画图的方式画上去的。
- 画图 API 和控件之间的关系,可以类比成机器指令和高级语言之间的关系。
- 控件是对画图 API 的进一步封装,画图 API 是控件的底层实现。
【绘图 API 核心类】
类 | 说明 |
---|---|
QPainter | “绘画者” 或者 “画家” ==> 用来绘图的对象,提供了一系列 drawXXX 方法,可以允许我们绘制各种图形. |
QPaintDevice | “画板” ==> 描述了 QPainter 把图形画到哪个对象上. 像咱们之前用过的 QWidget 也是一种 QPaintDevice (QWidget 是 QPaintDevice 的子类). |
QPen | “画笔” ==> 描述了 QPainter 画出来的线是什么样的. |
QBrush | “画刷” ==> 描述了 QPainter 填充一个区域是什么样的. |
绘图 API 的使用一般不会在 QWidget 的构造函数中使用,而是要放到 paintEvent
事件中,在这里进行调用
paintEvent
会在以下情况下被触发:
- 控件首次创建。
- 控件被遮挡,再解除遮挡。
- 窗口最小化,再恢复。
- 控件大小发生变化时。
- 主动调用
repaint()
或者update()
方法(这两个方法都是 QWidget 的方法)。
二、绘制各种形状
1. 绘制线段
代码语言:javascript代码运行次数:0运行复制void drawLine(const QPoint &p1, const QPoint &p2);
参数:
p1:绘制起点坐标
p2:绘制终点坐标
void drawLine ( int x1, int y1, int x2, int y2 );
参数:
x1,y1:绘制起点坐标
x2,y2:绘制终点坐标
【案例】
在 “widget.h” 头文件中声明绘图事件,然后在 “widget.cpp” 文件中重写 paintEvent()
方法,代码如下:
void Widget::paintEvent(QPaintEvent *event)
{
(void) event;
// 绘图工作就会放到这里来执行.
QPainter painter(this);
// 画一个线段.
painter.drawLine(20, 20, 200, 20);
painter.drawLine(QPoint(20, 100), QPoint(200, 100));
painter.drawLine(20, 20, 100, 300);
}
实现效果如下:
2. 绘制矩形
代码语言:javascript代码运行次数:0运行复制void QPainter::drawRect(int x, int y, int width, int height);
参数:
x:窗口横坐标;
y:窗口纵坐标;
width:所绘制矩形的宽度;
height:所绘制矩形的⾼度;
【案例】:和绘制线段操作类似,代码如下:
代码语言:javascript代码运行次数:0运行复制void Widget::paintEvent(QPaintEvent *event)
{
(void) event;
QPainter painter(this);
// 画一个矩形.
painter.drawRect(100, 100, 300, 200);
}
运行程序,如下:
3. 绘制圆形
代码语言:javascript代码运行次数:0运行复制void QPainter::drawEllipse(const QPoint ¢er, int rx, int ry)
参数:
center:中⼼点坐标
rx:横坐标
ry:纵坐标
【案例】:和上面类似,如下:
代码语言:javascript代码运行次数:0运行复制// 画圆形.
painter.drawEllipse(200, 200, 400, 100);
运行程序,如下:
4. 绘制文本
本文标签: 《突破控件限制用Qt绘图API解锁高级界面定制能力》
版权声明:本文标题:《突破控件限制:用Qt绘图API解锁高级界面定制能力》 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747646394a2198206.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论