您的位置:首页 > 编程语言 > Qt开发

Qt学习之十六:Qt绘制系统简介

2016-09-15 20:58 162 查看
Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter, QPainterDevice 和 QPaintEngine 三个类。

QPainter 用来执行绘制的操作; QPaintDevice 是一个二维空间的抽象,这个二维空间允许QPainter 在其上面进行绘制,也就是 QPainter 工作的空间; QPaintEngine 提供了画笔( QPainter)在不同的设备上进行绘制的统一的接口。 QPaintEngine 类应用于 QPainter 和

QPaintDevice 之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心 QPaintEngine 这个类的。我们可以把 QPainter 理解成画笔;把 QPaintDevice 理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了 QPaintEngine 类,这个类让不同的纸张、屏幕都能使用一种画笔。

下图给出了这三个类之间的层次结构(出自 Qt API 文档):

上面的示意图告诉我们, Qt 的绘图系统实际上是,使用 QPainter 在QPainterDevice 上进行绘制,它们之间使用 QPaintEngine 进行通讯(也就是翻译 QPainter 的指令)。

class PaintedWidget : public QWidget
{

Q_OBJECT
public:

PaintedWidget(QWidget* parent=0);

protected:

void PaintEvent(QPaintEvent* );

};

PaintedWidget::PaintedWidget(QWidget *parent)

:QWidget(parent)

{

resize(800,600);

setWindowTitle(tr("Painte Demo"));

}

void PaintedWidget::PaintEvent(QPaintEvent *)

{

QPainter  painter(this);

painter.drawLine(70,100,650,500);

painter.setPen(Qt::red);

painter.drawRect(10,10,100,400);

painter.setPen(QPen(Qt::green,5));

painter.setBrush(Qt::blue);

painter.drawEllipse(50,150,400,200);

}


QPainter 接收一个 QPaintDevice 指针作为参数。 QPaintDevice 有很多子类,比如 QImage,以及 QWidget。注意回忆一下, QPaintDevice 可以理解成要在哪里去绘制,而现在我们希望画在这个组件,因此传入的是 this 指针。



请注意我们的绘制顺序,首先是直线,然后是矩形,最后是椭圆。按照这样的绘制顺序,可以看到直线是第一个绘制,位于最下一层;矩形是第二个绘制,在中间一层;椭圆是最后绘制,在最上层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: