QT绘图总结

QT绘图总结

1.QT绘图介绍

如果想要使用一个图片或者直接在页面上写字就要使用QT绘图。
当然,也可以选择在组件上绘图,如QLabel。
Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。

怎么记住这三个类之间的关系呢?

可以从这三个英文的翻译来记。

有一个画家(QPainter),他经常出去写生,但是不可能直接画,肯定要有一个容器接收画的内容,可以是画板(QPainterDevice),但是除了画板还可以有画纸(QPaintEngine)。
画家在画纸上画画,而画纸又得在画板上夹住,要不纸可能承受不住画笔的力量而漏个洞。

2.QT绘图使用

要使用绘图,得重写QT的paintEvent事件。
上面简单说明了一下绘图的三个类,但是想起来就很复杂,每次绘图都是要使用三个类吗?

1.画家可以做什么呢?

选画刷、选画笔、写字、画一些图形、贴图片、更改画纸的位置、旋转画纸等。

void PaintedWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(80, 100, 200, 200);
painter.setPen(Qt::red);
painter.drawRect(10, 10, 10, 40);
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 40, 20);
}

2.如果没有画板(QPainterDevice)或者画纸(QPaintEngine)可以吗?

也是可以的,没有画板、画纸就是直接画在地上也是可以的。

void PaintedWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(80, 100, 200, 200);
    painter.setPen(Qt::red);
    painter.drawRect(10, 10, 10, 40);
    painter.setPen(QPen(Qt::green, 5));
    painter.setBrush(Qt::blue);
    painter.drawEllipse(50, 150, 40, 20);
}
3.如果没有画家(QPainter)可以吗?

也可以直接用绘画设备画画,一个普通人直接在画板上夹一张图片也能展示,但没有因为这个人不是画家就不会画画。不过如果想要在这图片上画画,就得是画家才行了。

void PaintWidget::paintEvent(QPaintEvent *)
{
    QPixmap pixmap(":/Image/1.png");
    QPixmap pixmap1(":/Image/2.png");
    QBitmap bitmap(":/Image/3.png");
    QBitmap bitmap1(":/Image/4.png");
 
    QPainter painter(this);
    painter.drawPixmap(0, 0, pixmap);
    painter.drawPixmap(200, 0, pixmap1);
    painter.drawPixmap(0, 130, bitmap);
    painter.drawPixmap(200, 130, bitmap1);
}

绘画设备有三种:QPixmap 、QBitmap、QImage。
QPixmap使用底层平台的绘制系统进行绘制,不支持像素级别的操作。
QImage使用独立于硬件的绘制系统,支持像素级别的操作。
QBitmap继承自QPixmap,不过只提供单色图像,不是黑像素点就是白像素点。

4.画纸(QPaintEngine)有啥作用呢,反正直接用画板也没有啥影响吧?

当然可以不使用画纸,画纸就是为了适配更多的绘画设备,有了画纸,就可以记录并重现绘画的内容了,如果你以后想使用现在画的这个东西,可以用画纸保存起来,以后不管是画板还是墙上还是画框,都是可以放这个画纸在里面的。

void PaintWidget::paintEvent(QPaintEvent *)
{
    QPicture pic;
    QPainter painter;
	 //将图像绘制到QPicture中,并保存到文件
    painter.begin(&pic);
    painter.drawEllipse(20, 20, 100, 50);
    painter.fillRect(20, 100, 100, 100, Qt::red);
    painter.end();
    pic.save("D:\\drawing.pic");
	 //将保存的绘图动作重新绘制到设备上
    pic.load("D:\\drawing.pic");
    painter.begin(this);
    painter.drawPicture(200, 200, pic);
    painter.end();
}
  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值