Qt 之 QPainter
这里写目录标题
- 二维图形
- 层次结构
- 绘图设备
- 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相关推荐
- QT 中QPainter绘制文字、图片
1. 把字符串绘制在QPixmap上 QPixmap MainWindow::text2Pixmap(QString text) { QFontMetrics fmt(m_font); QPixmap ...
- QT之QPainter用法
QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状.它也可以绘制排列的文本和像素映射.通常,它在一个"自然的"坐标系统中绘制. QPainter 一般在部件的绘图事件 ...
- Qt中QPainter的使用
Qt中QPainter的使用 GUI用户界面的优点是通过提供可视化的工具为客户提供便利的操作,界面上的按钮.编辑框等都是通过绘图得到的.Qt的二维绘图基本功能是使用QPainter在绘图设备上绘图,通 ...
- Qt使用QPainter绘制方式显示图片
Qt使用QPainter绘制方式显示图片 文章目录 Qt使用QPainter绘制方式显示图片 1.前言 2.主要代码 3.实现效果 4.源代码 更多精彩内容
- 【QT】QT从零入门教程(十三):QT画笔工具QPainter (双缓冲绘图)
QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage.QOpenGLPaintDevice.QWidget 和QPaintDevice 显示图形(线.形状.渐变等). ...
- Qt使用QPainter实现雷达图(玫瑰图)
利用 QPainter实现雷达图(玫瑰图).效果如下: 源码如下 //.h文件#ifndef CRADARDLG_H #define CRADARDLG_H#include <QWidget&g ...
- Qt绘制曲线图(基于qt画图QPainter)
在没有QCharst模块时,可以使用QPainter自定义绘制曲线折线图 下面提供完整代码供参考: 直接在qt创建一个QMainWindow类的app的工程,不自动生成ui文件,然后把下面代码复制到m ...
- Qt中 QPainter 刷新出现的问题
最近学习Qt 自定义绘画时碰到两个问题,问题如下: 自定义绘画图形,采用重写QPaintEvent,发现绘画不起作用: 1.Qpainter不刷新,解决方法:在触发刷新是,调用updata()函数强行 ...
- Qt 通过 QPainter 绘制坐标轴
一.概述 在自定义贝塞尔曲线中想绘制一个坐标轴. 二.步骤 2.1 新建一个类 PaintAxis 继承 QWidget 然后在界面上拖拽一个 widget,右键 widget 提升为 PaintAx ...
- Qt中QPainter基本绘图
QWidget 派系的只能在paintEvent中进行重绘:如果你想要很好的交互功能的话推荐QGraphicsView框架,自定义Item的绘制在paint函数:如果你想利用线程绘制的话,你可以创建个 ...
最新文章
- PHP SOAP 教程 实例一
- 77. 组合016(回溯法)
- Poj 1284 Primitive Roots
- 解决:java.lang.IllegalStateException: ApplicationEventMulticaster not initialized
- nedc和epa续航里程什么意思_NEDC、WLTP和EPA续航里程哪种最真实,用车注意事项都有什么...
- 1.php查询数据,查询数据 - ThinkPHP 5.1 完全开发手册
- 数据库---三大设计范式
- 怎样更改itunes备份位置_iphone备份太大,严重挤占C盘空间,怎么把备份放在其他的硬盘?...
- 如何最大化使用BI工具
- qt文件怎么设置全局变量_QT编程之——使用全局变量
- 复杂网络研究及其前沿概述
- 炒冷饭的“象棋人机大战”
- 【Go】Go 语言运算符及其优先级
- 下载安装SQL server2008的步骤
- 淘管家一键铺货怎么弄?和分销下单有什么区别?
- 大学的终结,终结了什么???
- java解释单片机按高位在前低位在后协议输出的数字
- 看完让你彻底理解 WebSocket 原理
- WIFI菠萝 strip-n-inject插件安装与使用
- 五色石FCS周报 2019.5.13-2019.5.19
热门文章
- 20年前的人机大战,IBM“深蓝”耍了花招
- ubuntu system setting no everthing
- java生成随机数的代码_java生成随机数的代码
- vs2003无法打开sal.h
- 一封来信,你的一封来信,一封Ta的来信,爆火的匿名信H5源码功能开发和分析,表白祝福道歉短信发送系统
- ankhsvn vs2017 64位下载 v2.7.12815
- cocos2dx图片加密解密(npk方式)
- 偶极子天线馈电及倒V天线
- XCVU9P收发卡设计资料原理图第612篇:基于XCVU9P的32路光纤PCIeX16收发卡
- 软件烧录的测试方法,烧录测试座使用及保养