这里写目录标题

  • 二维图形
    • 层次结构
    • 绘图设备
    • QPainter
      • 用QPainter绘图
      • QPainter三要素
      • 抗锯齿
      • QPainter Demo
      • paintEvent 作用
    • QPixmap和 QBitmap区别
    • 绘制状态的保存和加载
    • 坐标系统变换
    • QImage

二维图形

层次结构

层次 说明
1 QPainter 画笔
2 QPainterEngine 翻译QPainter的指令
3 QPaintDevice 画板

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

绘图设备

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。

绘图设备 说明
QPixmap 专门为图像在屏幕上的显示做了优化
QBitmap 是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。
QImage 专门为图像的像素级访问做了优化
QPicture 可以记录和重现QPainter的各条命令

QPainter

  • 可以画在“绘图设备”上,例如QWidget, QPixmap, QImage等。
  • 重新实现QWidget::paintEvent( )可用于定制窗口部件

用QPainter绘图

要想在绘图设备上绘图,只需创建一个QPainter, 再将指针传到该设备中。

void MyWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this);...
}

QPainter三要素

通过“画笔”,“画刷”,“字体” 来增强QPainter的绘制效果

No 要素 对象 接口
1 画笔 QPen setPen( )
2 画刷 QBrush setBrush( )
3 字体 QFont setFont( )

抗锯齿

QPainter painter(this);
painter.setRenderHint(QPainter::Antialising, true);  //设置抗锯齿效果,但是效率会偏低

QPainter Demo

class PaintedWidget : public QWidget
{Q_OBJECT
public:PaintedWidget(QWidget *parent = 0);
protected:/**  1. 回调函数*  2. 此函数不需要用户与调用, 再刷新的时候会自定调用*      1. 窗口显示的时候*      2. 最大化, 最小化*      3. 窗口被这遮挡, 重新显示的时候*      4. 用户强制刷新的时候*      5. ...........*  3. 如果想使用画家类在窗口中画图, 操作必须在paintEvent函数中完成*/void paintEvent(QPaintEvent *);
}
PaintedWidget::PaintedWidget(QWidget *parent) :QWidget(parent)
{resize(800, 600);setWindowTitle(tr("Paint Demo"));
}void PaintedWidget::paintEvent(QPaintEvent *)  //重写paintEvent函数
{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);
}

paintEvent 作用

绘制的代码,在paintEvent中。
起始paintEvent( )是一直调用的,调试时,会发现不断地执行paintEvent操作。

因此,如果要更新当前画面中的要素,在paintEvent中可以隐藏或擦除某些元素。这在动态显示画面元素时非常有用。

  • 由于QPainter对象是在paintEvent( )函数中创建,因此是在栈中创建的,所以退出会消失。
  • 每次运行都会重建QPainter对象,可能第一次运行时所设置的画笔颜色,状态等,第二次在即进入时会消失
  • 希望保存画笔状态:就必须自己保存数据,否则,需要将QPainter作为类的成员变量。

QPixmap和 QBitmap区别

  • QPixmap 继承了QPaintDeivce, 可以把文件绘制到一个QLabel、QPushButton
  • QBitmap继承自QPixmap, 提供单色图像,色深始终为1, 即只有黑白两色。
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBitmap>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *)
{QPainter p(this);//QPixmap 图片背景透明p.drawPixmap(0, 0, QPixmap("../Image/butterfly.png"));  //draws the given pixmap at position(x,y)//QBitmap 图片背景透明p.drawPixmap(200, 0, QBitmap("../Image/butterfly.png")); //QBitmap//QPixmap 图片背景白色QPixmap pixmap;pixmap.load("../Image/butterfly1.png");p.drawPixmap(0, 200, pixmap);//QBitmap 图片背景白色QBitmap bitmap;bitmap.load("../Image/butterfly1.png");p.drawPixmap(200, 200, bitmap);}

绘制状态的保存和加载

  • QPainter的状态设置可以使用save()多次保存,使用restore()函数取出每次保存的状态
  • 使用save()函数保存多个设置的时候,其内部的存储方式为栈,使用restore()函数取保存的状态的时候相当于取出栈顶元素,并将其从栈顶弹出。

坐标系统变换

QImage

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个绘图设备,QImage::Format_ARGB32背景是透明QImage image(400, 300, QImage::Format_ARGB32);QPainter p;p.begin(&image);//绘图p.drawImage(0, 0, QImage("../Image/face.png"));//对绘图设备前50个像素点进行操作for(int i = 0; i < 50; i++){for(int j = 0; j < 50; j++){image.setPixel(QPoint(i, j), qRgb(0, 255, 0));//image.pixel(QPoint(i, j));}}p.end();image.save("../image.png");}Widget::~Widget()
{delete ui;
}

Qt 之 QPainter相关推荐

  1. QT 中QPainter绘制文字、图片

    1. 把字符串绘制在QPixmap上 QPixmap MainWindow::text2Pixmap(QString text) { QFontMetrics fmt(m_font); QPixmap ...

  2. QT之QPainter用法

    QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状.它也可以绘制排列的文本和像素映射.通常,它在一个"自然的"坐标系统中绘制. QPainter 一般在部件的绘图事件 ...

  3. Qt中QPainter的使用

    Qt中QPainter的使用 GUI用户界面的优点是通过提供可视化的工具为客户提供便利的操作,界面上的按钮.编辑框等都是通过绘图得到的.Qt的二维绘图基本功能是使用QPainter在绘图设备上绘图,通 ...

  4. Qt使用QPainter绘制方式显示图片

    Qt使用QPainter绘制方式显示图片 文章目录 Qt使用QPainter绘制方式显示图片 1.前言 2.主要代码 3.实现效果 4.源代码 更多精彩内容

  5. 【QT】QT从零入门教程(十三):QT画笔工具QPainter (双缓冲绘图)

      QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage.QOpenGLPaintDevice.QWidget 和QPaintDevice 显示图形(线.形状.渐变等). ...

  6. Qt使用QPainter实现雷达图(玫瑰图)

    利用 QPainter实现雷达图(玫瑰图).效果如下: 源码如下 //.h文件#ifndef CRADARDLG_H #define CRADARDLG_H#include <QWidget&g ...

  7. Qt绘制曲线图(基于qt画图QPainter)

    在没有QCharst模块时,可以使用QPainter自定义绘制曲线折线图 下面提供完整代码供参考: 直接在qt创建一个QMainWindow类的app的工程,不自动生成ui文件,然后把下面代码复制到m ...

  8. Qt中 QPainter 刷新出现的问题

    最近学习Qt 自定义绘画时碰到两个问题,问题如下: 自定义绘画图形,采用重写QPaintEvent,发现绘画不起作用: 1.Qpainter不刷新,解决方法:在触发刷新是,调用updata()函数强行 ...

  9. Qt 通过 QPainter 绘制坐标轴

    一.概述 在自定义贝塞尔曲线中想绘制一个坐标轴. 二.步骤 2.1 新建一个类 PaintAxis 继承 QWidget 然后在界面上拖拽一个 widget,右键 widget 提升为 PaintAx ...

  10. Qt中QPainter基本绘图

    QWidget 派系的只能在paintEvent中进行重绘:如果你想要很好的交互功能的话推荐QGraphicsView框架,自定义Item的绘制在paint函数:如果你想利用线程绘制的话,你可以创建个 ...

最新文章

  1. PHP SOAP 教程 实例一
  2. 77. 组合016(回溯法)
  3. Poj 1284 Primitive Roots
  4. 解决:java.lang.IllegalStateException: ApplicationEventMulticaster not initialized
  5. nedc和epa续航里程什么意思_NEDC、WLTP和EPA续航里程哪种最真实,用车注意事项都有什么...
  6. 1.php查询数据,查询数据 - ThinkPHP 5.1 完全开发手册
  7. 数据库---三大设计范式
  8. 怎样更改itunes备份位置_iphone备份太大,严重挤占C盘空间,怎么把备份放在其他的硬盘?...
  9. 如何最大化使用BI工具
  10. qt文件怎么设置全局变量_QT编程之——使用全局变量
  11. 复杂网络研究及其前沿概述
  12. 炒冷饭的“象棋人机大战”
  13. 【Go】Go 语言运算符及其优先级
  14. 下载安装SQL server2008的步骤
  15. 淘管家一键铺货怎么弄?和分销下单有什么区别?
  16. 大学的终结,终结了什么???
  17. java解释单片机按高位在前低位在后协议输出的数字
  18. 看完让你彻底理解 WebSocket 原理
  19. WIFI菠萝 strip-n-inject插件安装与使用
  20. 五色石FCS周报 2019.5.13-2019.5.19

热门文章

  1. 20年前的人机大战,IBM“深蓝”耍了花招
  2. ubuntu system setting no everthing
  3. java生成随机数的代码_java生成随机数的代码
  4. vs2003无法打开sal.h
  5. 一封来信,你的一封来信,一封Ta的来信,爆火的匿名信H5源码功能开发和分析,表白祝福道歉短信发送系统
  6. ankhsvn vs2017 64位下载 v2.7.12815
  7. cocos2dx图片加密解密(npk方式)
  8. 偶极子天线馈电及倒V天线
  9. XCVU9P收发卡设计资料原理图第612篇:基于XCVU9P的32路光纤PCIeX16收发卡
  10. 软件烧录的测试方法,烧录测试座使用及保养