Qt绘制系统
目录 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于 QPainter,QPainterDevice 和 QPaintEngine 三个类。
- QPainter: 来执行绘制操作
- QPainterDevice: 是一个二维空间的抽象,这个二维空间允许QPainter 在其上面进行绘制,也就是 QPainter 工作的空间。
- QPainterEngine: 提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine 类应用于 QPainter和 QPaintDevice 之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心 QPaintEngine 这个类的。
#include "paintedwidget.h"
#include <QPainter>
#include <QPaintEvent>
PaintedWidget::PaintedWidget(QWidget *parent):QWidget(parent)
{
setFixedSize(600, 400);
setWindowTitle("Paint");
}
void PaintedWidget::paintEvent(QPaintEvent *) {
QPainter painter(this);
painter.drawLine(80, 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 指针。
#include "paintedwidget.h"
#include <stdio.h>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QWheelEvent>
PaintedWidget::PaintedWidget(QWidget *parent):QWidget(parent)
{
// setFixedSize(600, 400);
setWindowTitle("Paint");
}
void PaintedWidget::paintEvent(QPaintEvent *) {
QPainter *painter = new QPainter(this);
painter->drawEllipse(x-r/2, y-r/2, r, r);
delete painter;
}
void PaintedWidget::wheelEvent(QWheelEvent *event) {
QPoint degree = event->angleDelta();
if (degree.y() > 0) {
r++;
} else {
r--;
}
if (r <= 0) {
r = 0;
}
x = event->position().x();
y = event->position().y();
this->update();
}