Qt绘图和绘图设备

 

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文件:

 
  1. class PaintedWidget : public QWidget

  2. {

  3. Q_OBJECT

  4. public:

  5. PaintedWidget(QWidget *parent = 0);

  6. protected:

  7. void paintEvent(QPaintEvent *);

  8. }

painterwidget.cpp文件:

 
  1. PaintedWidget::PaintedWidget(QWidget *parent) :

  2. QWidget(parent)

  3. {

  4. resize(800, 600);

  5. setWindowTitle(tr("Paint Demo"));

  6. }

  7.  
  8. void PaintedWidget::paintEvent(QPaintEvent *)

  9. {

  10. QPainter painter(this);

  11. painter.drawLine(80, 100, 650, 500);

  12. painter.setPen(Qt::red);

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

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

  15. painter.setBrush(Qt::blue);

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

  17. }

QPainter和QPainterDevice是画师和画板的关系,其中QPainter相当于画师,QPainterDevice相当于画板。

QPainter绘图有两种格式:

1.将QPainterDevice对象的指针直接传入到QPainter的构造函数,然后调用draw开头的函数;

 
  1. Widget::Widget(QWidget *parent) :

  2. QWidget(parent),

  3. ui(new Ui::Widget)

  4. {

  5. ui->setupUi(this);

  6.  
  7. //绘图设备, 400*300

  8. QPixmap pixmap(400, 300);

  9.  
  10. QPainter p(&pixmap);

  11. //填充白色背景色

  12. //p.fillRect(0, 0, 400, 300, QBrush(Qt::white));

  13.  
  14. pixmap.fill(Qt::white);

  15.  
  16. p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));

  17.  
  18. //保存图片

  19. pixmap.save("../pixmap.jpg");

  20.  
  21.  
  22.  
  23. }

 

2.将QPainterDevice对象传入QPainter的begin()函数,然后调用draw开头的函数,绘制完毕一定要调用QPainter的end()函数。

 
  1. void Widget::paintEvent(QPaintEvent *)

  2. {

  3. //QPainter p(this);

  4.  
  5. QPainter p;//创建画家对象

  6. p.begin(this);//指定当前窗口为绘图设备

  7.  
  8. //绘图操作

  9. //p.drawxxx();

  10. //画背景图

  11. //p.drawPixmap(0, 0, width(), height(), QPixmap("../Image/bk.png"));

  12. p.drawPixmap(rect(), QPixmap("../Image/bk.png"));

  13.  
  14. //定义画笔

  15. QPen pen;

  16. pen.setWidth(5); //设置线宽

  17. //pen.setColor(Qt::red); //设置颜色

  18. pen.setColor( QColor(14, 9, 234) );//rgb设置颜色

  19. pen.setStyle(Qt::DashLine); //设置风格

  20.  
  21. //把画笔交给画家

  22. p.setPen(pen);

  23.  
  24. //画直线

  25. p.drawLine(50, 50, 150, 50);

  26. p.drawLine(50, 50, 50, 150);

  27.  
  28. //创建画刷对象

  29. QBrush brush;

  30. brush.setColor(Qt::red); //设置颜色

  31. brush.setStyle(Qt::Dense1Pattern);//设置样式

  32.  
  33. //把画刷交给画家

  34. p.setBrush(brush);

  35.  
  36.  
  37. //画矩形

  38. p.drawRect(150, 150, 100, 50);

  39.  
  40. //画圆形

  41. p.drawEllipse(QPoint(150, 150), 50, 25);

  42.  
  43. //画笑脸

  44. p.drawPixmap(x, 180, 80, 80, QPixmap("../Image/face.png"));

  45.  
  46. p.end();

  47. }

QPainter有很多以 draw 开头的函数,用于各种图形的绘制,比如这里的drawLine(),drawRect()以及drawEllipse()等。当绘制轮廓线时,使用QPainter的pen()属性。比如,我们调用了painter.setPen(Qt::red)将 pen 设置为红色,则下面绘制的矩形具有红色的轮廓线。接下来,我们将 pen 修改为绿色,5 像素宽(painter.setPen(QPen(Qt::green, 5))),又设置了画刷为蓝色。这时候再调用 draw 函数,则是具有绿色 5 像素宽轮廓线、蓝色填充的椭圆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值