2018年03月11日 22:00:38 SallenKey 阅读数:360
QPainter
Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。我们可以把QPainter理解成画笔;把QPaintDevice理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine类,这个类让不同的纸张、屏幕都能使用一种画笔。
下图给出了这三个类之间的层次结构:
上面的示意图告诉我们,Qt 的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。
QPainter可以在任意QPainterDevice上绘图,QPainterDevice有很多子类,其中包括QWidget,QImage,QPixmap,QBitmap,QPicture,在QWidget上绘图时,一般在重载的paintEvent()事件处理函数中进行,而绘图设备为图像类型时,可以在任何地方进行,关于Qt中的图像设配类,详见:
http://blog.csdn.net/xiaoyink/article/details/79513327
下面我们通过一个实例来介绍QPainter的使用:
painterwidget.h文件:
-
class PaintedWidget : public QWidget
-
{
-
Q_OBJECT
-
public:
-
PaintedWidget(QWidget *parent = 0);
-
protected:
-
void paintEvent(QPaintEvent *);
-
}
painterwidget.cpp文件:
-
PaintedWidget::PaintedWidget(QWidget *parent) :
-
QWidget(parent)
-
{
-
resize(800, 600);
-
setWindowTitle(tr("Paint Demo"));
-
}
-
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和QPainterDevice是画师和画板的关系,其中QPainter相当于画师,QPainterDevice相当于画板。
QPainter绘图有两种格式:
1.将QPainterDevice对象的指针直接传入到QPainter的构造函数,然后调用draw开头的函数;
-
Widget::Widget(QWidget *parent) :
-
QWidget(parent),
-
ui(new Ui::Widget)
-
{
-
ui->setupUi(this);
-
//绘图设备, 400*300
-
QPixmap pixmap(400, 300);
-
QPainter p(&pixmap);
-
//填充白色背景色
-
//p.fillRect(0, 0, 400, 300, QBrush(Qt::white));
-
pixmap.fill(Qt::white);
-
p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));
-
//保存图片
-
pixmap.save("../pixmap.jpg");
-
}
2.将QPainterDevice对象传入QPainter的begin()函数,然后调用draw开头的函数,绘制完毕一定要调用QPainter的end()函数。
-
void Widget::paintEvent(QPaintEvent *)
-
{
-
//QPainter p(this);
-
QPainter p;//创建画家对象
-
p.begin(this);//指定当前窗口为绘图设备
-
//绘图操作
-
//p.drawxxx();
-
//画背景图
-
//p.drawPixmap(0, 0, width(), height(), QPixmap("../Image/bk.png"));
-
p.drawPixmap(rect(), QPixmap("../Image/bk.png"));
-
//定义画笔
-
QPen pen;
-
pen.setWidth(5); //设置线宽
-
//pen.setColor(Qt::red); //设置颜色
-
pen.setColor( QColor(14, 9, 234) );//rgb设置颜色
-
pen.setStyle(Qt::DashLine); //设置风格
-
//把画笔交给画家
-
p.setPen(pen);
-
//画直线
-
p.drawLine(50, 50, 150, 50);
-
p.drawLine(50, 50, 50, 150);
-
//创建画刷对象
-
QBrush brush;
-
brush.setColor(Qt::red); //设置颜色
-
brush.setStyle(Qt::Dense1Pattern);//设置样式
-
//把画刷交给画家
-
p.setBrush(brush);
-
//画矩形
-
p.drawRect(150, 150, 100, 50);
-
//画圆形
-
p.drawEllipse(QPoint(150, 150), 50, 25);
-
//画笑脸
-
p.drawPixmap(x, 180, 80, 80, QPixmap("../Image/face.png"));
-
p.end();
-
}
QPainter有很多以 draw 开头的函数,用于各种图形的绘制,比如这里的drawLine(),drawRect()以及drawEllipse()等。当绘制轮廓线时,使用QPainter的pen()属性。比如,我们调用了painter.setPen(Qt::red)将 pen 设置为红色,则下面绘制的矩形具有红色的轮廓线。接下来,我们将 pen 修改为绿色,5 像素宽(painter.setPen(QPen(Qt::green, 5))),又设置了画刷为蓝色。这时候再调用 draw 函数,则是具有绿色 5 像素宽轮廓线、蓝色填充的椭圆