qt:绘图体系模型



qt绘图体系模型:
QPainter:绘图操作者
QPaintEngine:对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。绘图操作者与绘图设备的通信中间层,一般是对开发者透明,除非要实现自定义绘图设备;
QPaintDevice:绘图设备,绘图的目标,承载绘图效果的逻辑空间;

五种绘图设备:
QPixmap:【即是一种平台差别绘图设备】
是针对屏幕进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是操作系统提供的原生的绘图引擎。所以,在不同的操作系统平台下,QPixmap的显示可能会有所差别。无法提供像素级别的操作,依赖于各个平台底层绘图引擎

QBitmap:【即单色绘图设备】
继承自QPixmap,因此具有QPixmap的所有特性,提供单色图像;实际上是只有黑白两色的图像数据

QImage:【平台独立绘图设备】
使用Qt自身的绘图引擎,可在不同平台上具有相同的显示效果;由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度。可操作像素级

QPicture:【永久保存绘图设备,类似于xml,json,protobuf等是独立语言独立平台的保存格式】【逻辑上也拥有无限的大小】
这是一个可以记录和重现QPainter命令的绘图设备。 QPicture将QPainter的命令序列化到一个IO设备,保存为一个平台独立的文件格式。这种格式有时候会是“元文件(meta- files)”。Qt的这种格式是二进制的,不同于某些本地的元文件,Qt的pictures文件没有内容上的限制,只要是能够被QPainter绘制的元素,不论是字体还是pixmap,或者是变换,都可以保存进一个picture中。
QPicture是平台无关的,因此它可以使用在多种设备之上,比如svg、pdf、ps、打印机或者屏幕。回忆下我们这里所说的QPaintDevice,实际上是说可以有QPainter绘制的对象。QPicture使用系统的分辨率,并且可以调整 QPainter来消除不同设备之间的显示差异。
如果我们要记录下QPainter的命令,首先要使用QPainter::begin()函数,将QPicture实例作为参数传递进去,以便告诉系统开始记录,记录完毕后使用QPainter::end()命令终止。

QWidget:窗口绘图设备

绘图设备可以使用QPainter在其绘图设备上进行绘图;也可以做为一部分贴图到其他绘图设备上,见下图代码



QImage与QPixmap之间的转换:
* QImage转QPixmap
使用QPixmap的静态成员函数: fromImage()
QPixmap    fromImage(const QImage & image,
Qt::ImageConversionFlags flags = Qt::AutoColor)
* QPixmap转QImage:
使用QPixmap类的成员函数: toImage()
QImage toImage() const



//示例
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QDebug>
#include<QImage>
#include<QPicture>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}


void Widget::paintEvent(QPaintEvent *event)
{
    QPixmap pix(300,300);
    pix.fill(Qt::white);
    QPainter painter(&pix);
    painter.setPen(Qt::green);
    painter.drawEllipse(QPoint(150,150),100,100);
    if(!pix.save("./pix.png"))
        qDebug()<<"failed!";


    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);
    QPainter painter2(&img);
    painter2.setPen(Qt::blue);
    painter2.drawEllipse(QPoint(150,150),100,100);
    if(!img.save("./img.png"))
        qDebug()<<"failed!";


    QPicture pic;
    QPainter painter3;
    painter3.begin(&pic);
    painter3.setPen(Qt::black);
    painter3.drawEllipse(QPoint(150,150),100,100);
    painter3.end();
    pic.save("pic.tsss");


    QPicture lpic;
    lpic.load("pic.tsss");
    QPainter lpainter(this);
    lpainter.drawPicture(QPoint(200,200),lpic);


}






Widget::~Widget()
{
    delete ui;
}





  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1 1 Qt概述 3 1.1 什么是Qt 3 1.2 Qt的发展史 4 1.3 支持的平台 4 1.4 Qt版本 4 1.5 Qt的安装 5 Linux Host 5 OS X Host 5 Windows Host 5 1.6 Qt的优点 5 2 创建Qt项目 6 2.1 使用向导创建 6 2.2 手动创建 9 2.3 .pro文件 10 2.4 一个最简单的Qt应用程序 12 3 信号和槽机制 13 3.1 信号和槽 13 3.2 自定义信号槽 15 自定义信号槽需要注意的事项 18 信号槽的更多用法 18 3.3 Lambda表达式 19 4 Qt窗口系统 21 4.1 Qt窗口坐标体系 21 坐标体系 21 4.2 QWidget 21 4.2.1 对象模型 21 4.3 QMainWindow 23 4.3.1 菜单栏 24 4.3.2 工具栏 25 4.3.3 状态栏 25 4.4 资源文件 26 4.5 对话框QDialog 29 4.5.1 基本概念 29 4.5.2 标准对话框 30 4.5.3 自定义消息框 31 4.5.4 消息对话框 33 4.5.5 标准文件对话框 36 4.6 常用控件 39 4.6.1 QLabel控件使用 39 4.6.2 QLineEdit 41 4.6.3 其他控件 43 4.7 布局管理器 43 4.7.1 水平/垂直/网格布局 44 4.7.2 自定义控件 46 5 Qt消息机制和事件 50 5.1 事件 50 5.2 event() 52 5.3 事件过滤器 55 5.4 总结 59 5.5 不规则窗体 62 6 绘图绘图设备 63 6.1 QPainter 63 6.2 绘图设备 65 6.2.1 QPixmap、QBitmap、QImage 66 6.2.2 QPicture 69 7 文件系统 70 7.1 基本文件操作 71 7.2 二进制文件读写 73 7.3 文本文件读写 75 8 Socket通信 76 8.1 TCP/IP 77 服务器端 77 客户端 79 8.2 UDP 81 广播 82 组播 82 8.3 TCP/IP 和 UDP的区别 83 9 多线程 83 9.1 线程介绍 84 9.2 多线程的使用 87 9.3 使用线程绘图 89 10 数据库操作 91 10.1 数据库操作 91 10.2 使用模型操作数据库 97 查询操作 97 插入操作 98 更新操作 99 删除操作 100 10.3 可视化显示数据库数据 100 11 Qt程序打包 102 1Qt概述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值