《突破控件限制:用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() 方法,代码如下:

代码语言:javascript代码运行次数:0运行复制
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);
}

实现效果如下:

image-20250203151128560
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);
}

运行程序,如下:

image-20250203151352877
3. 绘制圆形
代码语言:javascript代码运行次数:0运行复制
void QPainter::drawEllipse(const QPoint &center, int rx, int ry) 
参数:
    center:中⼼点坐标
    rx:横坐标
    ry:纵坐标

【案例】:和上面类似,如下:

代码语言:javascript代码运行次数:0运行复制
// 画圆形.
painter.drawEllipse(200, 200, 400, 100);

运行程序,如下:

image-20250203151454098
4. 绘制文本