qt5绘图和绘图设备

   Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。

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

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

 

下图给出了这三个类之间的层次结构:

 

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

mywidget.h

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    //重写绘图事件,虚函数
    //如果在窗口绘图,必须在绘图事件里实现
    //绘图事件内部自动调用,窗口需要重绘的时候(状态改变)
   void paintEvent(QPaintEvent *event);//QWidget 中定义的虚函数。
private slots:
   void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    int x;
};

#endif // WIDGET_H

  新建wiget类继承与qwidget.通过重写QWidget定义的虚函数 ,virtual void  paintEvent(QPaintEvent *event)实现。通过帮助文档 F1知,paintEvent被调用的时机是,1.当窗口需要重新绘制时候。2.调用repaint() or update()函数来激发。3.其他原因。

on_pushButton_clicked()函数,是ui里面按钮组件,通过转到槽自动出现的。槽函数里面通过update()函数调用 paintEvent函数执行重绘。

QPainter::QPainter(QPaintDevice *device) 

 QPainter接收一个QPaintDevice指针作为参数。QPaintDevice画图设备。

QPaintDevice可以理解成要在哪里去绘制,而现在我们希望画在这个组件,因此传入的是 this 指针。

绘图设备是指继承QPainterDevice的子类。

Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。

QPixmap继承了QPaintDevice,因此,你可以使用QPainter直接在上面绘制图形。

QPixmap也可以接受一个字符串作为一个文件的路径来显示这个文件,比如你想在程序之中打开png、jpeg之类的文件,就可以使用 QPixmap。使用QPainter的drawPixmap()函数可以把这个文件绘制到一个QLabel、QPushButton或者其他的设备上面。

QPixmap是针对屏幕进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是操作系统提供的原生的绘图引擎。

QBitmap继承自QPixmap,因此具有QPixmap的所有特性,提供单色图像。

 

 

mywidget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家
#include<QBrush>//画刷,填充颜色
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    x=0;
}

Widget::~Widget()
{
    delete ui;
}
 void Widget::paintEvent(QPaintEvent *event)
 {

     //QPainter p(this);//需要指定画图设备,为widget窗口类对象。
     //方式2
     QPainter p;    //创建画家对象 
     p.begin(this);//制定当前窗口为绘图设备
     //画背景图
     //p.drawPixmap(0,0,width(),height(),QPixmap("../image/image1.jpg"));
     //p.drawPixmap(rect(),QPixmap("../image/image1.jpg"));
     //绘图操作
     //p.draw();
     // 定义画笔
     QPen pen;
     pen.setWidth(5);
     pen.setColor(Qt::red);
      //pen.setColor(QColor(14,9,234));//reg设置颜色。右击个性化,窗口颜色,颜色,里面有reg
     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,200,80,80,QPixmap("../image/smile.jpg"));
     p.end();
 }

void Widget::on_pushButton_clicked()
{
   x+=20;
  if(x>width())//大于窗口宽度 width获取窗口宽度
  {
      x=0;
  }
  //刷新窗口,让窗口重绘
  update();//间接调用painrEvent();手动刷新窗口
}

 

`

 

 

QPainter()

QPainter(QPaintDevice *device)
void QPainter::drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)

 

 

QT5 学习之路24---Qt 绘制系统简介

Qt5 学习之路及嵌入式开发教程20:Qt5绘图---QPainterQt开发技术:

Qt绘图系统(一)绘图系统介绍

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值