qt 绘图QPainter
QPainter绘图系统
QPainter用来进行绘图操作的类。绘图设备一般包括Qwidget、Qpixmap、QImage.他们提供给QPainter画布。
QPaintDevice是一个可以使用QPainter进行绘图的抽象二维界面。
QPaintEngine给QPainter提供在不同设备上绘图的接口,QPaintEngine类由QPainter和QPaintDevice内部使用,应用程序一般无需使用QPaintEngine。
绘图设备包括QWidget、QPixmap、QImage等。
paintEvent世界和绘图区
QWidget类及其子类是最常用的绘图设备,从QWidget类继承的类都有paintEvent()事件,只需要重定义此事件就行。 相当于windows mfc的onpaint函数。
只要窗口部件需要被重绘就被调用。是repaint()或update()的结果。 几次调用update()的结果通常仅仅是一次paintEvent()调用。 Qt通常在paintEvent()调用之前擦除这个窗口部件的区域。
update()相当于 mfc 的invalidate();迫使paintEvent虚函数被调用。
QWidget绘图区就是其窗口内部区域。坐标系统的单位是像素。左上角坐标为(0,0)。这个坐标系统是物理坐标,称为视口(viewport)坐标。
高度:QWidget::height()
宽度:QWidget::width()
设置qwidget窗口大小的函数
1.setMinimumSize(固定最小大小) setMaximumSize(固定最大大小) 能够设置初始大小
2.setFixedSize 固定大小, 能够设置初始大小,但是之后就不能用鼠标调整窗口大小了
3.resize 推荐使用的方法
4.setGeometry
延伸到控件的缩放方式sizePolicy
控件的 sizePolicy 说明控件在布局管理中的缩放方式
Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以
放大。
Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。
Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小
Expandint:控件可以自行增大或者缩小
m_paddBtn = new QPushButton(tr("添加"));
m_paddBtn->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
.延伸到控件的大小sizeHint
这个属性所保存的 QSize 类型的值是一个被推荐给窗口或其它组件(为了方便下面统称为widget)的尺寸,也就是说一个 widget 该有多大,它的一个参考来源就是这个 sizeHint 属性的值,而这个值由 sizeHint() 函数来确定。
1.在 widget 有 layout 的情况下,其 sizeHint() 函数返回的是有效值作为其自身实际尺寸的参考;
2. sizeHint() 返回的值并不一定会作为 widget 的实际尺寸,因为 widget 的尺寸的决定还有其它因素作用;
sizeHint为虚函数,重写该函数即可。virtual QSize sizeHint() const;
QPainter绘图主要属性
QPen:画笔,用于控制线条的颜色、宽度等。
setPen、setStyle(线条样式)、setCapStyle(线条端点样式)、setJoinStyle(线条连接样式)
QBrush:画刷,用于填充颜色、渐变特性等。
setBrush、setStyle(填充样式)
渐变色:
线性渐变:QLinearGradient
辐射渐变:QRadialGradient
圆锥形渐变:QConicalGradient
//线性渐变QLinearGradient linearGrad(0,0,100,0);//从左到右,linearGrad.setColorAt(0,Qt::yellow);//起点颜色linearGrad.setColorAt(1,Qt::green);//终点颜色linearGrad.setSpread(QGradient::PadSpread); //展布模式painter.setBrush(linearGrad);
QFont:字体属性,用于绘制文字时,设置文字的样式、大小等
setFont
绘图
点:drawPoint()、drawPoints()、
线:drawLine()、
区域:drawRect()
文本:drawText()
Qt提供了处理图像数据的类:QImage, QPixmap和QPicture。
- QImage是为I/O和直接像素访问和操作而设计和优化的
- QPixmap是为在屏幕上显示图像而设计和优化的。
- QPicture类是一个记录和回放QPainter命令的绘制设备。
drawPicture: QPicture
QPicture picture;QPainter painter;painter.begin(&picture); // paint in picturepainter.drawEllipse(10,20, 80,70); // draw an ellipsepainter.end(); // painting donepicture.save("drawing.pic"); // save pictureQPicture picture;
QPainter painter;
picture.load("drawing.pic");
painter.begin(this);
painter.drawPicture(0,0,picture);
painter.end();
drawPixmap: QPixmap
QPixmap绘图依赖硬件,QPixmap的设计本来就是用来加速显示,用paint绘图时用QPixmap会比其他类的效果好很多。一般小图片用QPixmap加载,和平台相关(在不同的平台可能绘制出的效果不一样)。QPixmap上绘图比较慢,但显示它则比较快(使用GPU处理,相对减轻了CPU的负担).
可以直接使用构造函数,关联资源 ,如 QPixmap(":/res/python.jpg");也可以使用load、save进行加载或保存。
load() | 加载图像文件作为QPixmap对象 |
save() | 将QPixmap对象保存为文件 |
QRect rect1(0,0,100,100);paint.drawPixmap(rect1,QPixmap(tr(":/res/about.png")));
drawImage QImage
QImage类提供了一个独立于硬件的图像表示,它允许直接访问像素数据,并且可以用作绘制设备;适合加载大图片;可以在线程中绘图,可以优化UI响应时间。绘制图片出来的效果和平台无关,QImage上绘图比较快,但显示它则比较慢。
QImage的基本函数的使用与QPixmap类似,可以直接使用构造函数,关联资源
QRect rect2(100,0,100,100);paint.drawImage(rect2,QImage(tr(":/res/about.png")));
QPixmap与QImage的区别:
QPixmap依赖于硬件,QImage不依赖于硬件。
QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的。
当图片小的情况下,直接用QPixmap进行加载,画图时无所谓,当图片大的时候如果直接用QPixmap进行加载,会占很大的内存,一般一张几十K的图片,用QPixmap加载进来会放大很多倍。
所以一般图片大的情况下,用QImage进行加载,然后转乘QPixmap用户绘制。QPixmap绘制效果是最好的。
QImage image = pixmap.toImage();
QPixmap pixmap = QPixmap::fromImage(image);
坐标平移:translate
坐标旋转:rotate
缩放:scaled
状态保存 save
状态恢复 restore
恢复所有操作: resetTransform
坐标
物理坐标:
即视口坐标,setviewport 默认情况下,视口等于绘图设备的整个矩形区。单位为像素、
逻辑坐标:
窗口坐标,中心为原点(0,0)setwindow 如果想不用管实际物理坐标范围大小,可通过设置成窗口坐标来绘图。这是设备大小变化时,绘制的图片也自动变化大小。
调用setwindow后,后面用到的坐标都是按逻辑坐标来算了的。是按比例缩放
void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);int W=width();int H=height();int side=qMin(W,H);//去长和宽的小值QRect rect((W-side)/2, (H-side)/2,side,side); //viewport矩形区painter.drawRect(rect); //Viewport大小painter.setViewport(rect);//设置Viewportpainter.setWindow(-100,-100,200,200); // 设置窗口大小,逻辑坐标painter.setRenderHint(QPainter::Antialiasing);//设置画笔QPen pen;pen.setWidth(1); //线宽pen.setColor(Qt::red); //划线颜色//Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLinepen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等//Qt::FlatCap, Qt::SquareCap,Qt::RoundCappen.setCapStyle(Qt::FlatCap);//线端点样式//Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoinpen.setJoinStyle(Qt::BevelJoin);//线的连接点样式painter.setPen(pen);painter.setCompositionMode(QPainter::CompositionMode_Difference);for(int i=0; i<36;i++){painter.drawEllipse(QPoint(50,0),50,50);painter.rotate(10);}
}
裁剪区域 setClipRegion
延伸:设置widget的背景图片的办法
1.在paintEvent事件中绘制图片
void Widget::paintEvent(QPaintEvent * ev)
{QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/bg.jpg"),QRect());
}
缺点就是要使用paintEvent事件需要新建一个类,不适合子窗口
2.使用调色板QPalette来设置图片
QPalette pal =this->palette();
pal.setBrush(QPalette::Background,QBrush(QPixmap(":/bg.jpg")));
setPalette(pal);
3.使用样式表(setStyleSheet)
setStyleSheet("border-image:url(:/bg.jpg)");
项目经验1
1.整个程序的大小通过sizeHint函数设置默认的大小
2.框架的widget重写resizeEvent函数(相当于mfc的onsize),调用height、width函数获取到高度、宽度。再通过setGeometry设置画图的区域widget的大小。
3.画图的区域widget重写paintEvent函数。x、y轴都是按比例的画点,画线。(通过画图的区域的高度、宽度。数据的最大值、最小值和实时值。从而按比例算出x,y点坐标。)。
项目经验2
1.直接重写paintEvent函数,默认是视口坐标。即setviewport. 使用的坐标都是固定位置,就算窗口大小变化了,还是固定的。
问题就是有部分图形可能会被遮挡,不会绘图。
项目经验3
直接重写paintEvent函数,但调用setwindow函数使用窗口坐标。这样窗口大小变化时,图形按比例进行缩放。
qt 绘图QPainter相关推荐
- c++ qt获取电脑的内存_QT开发(十四)——QT绘图系统
一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngin ...
- QT之QPainter用法
QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状.它也可以绘制排列的文本和像素映射.通常,它在一个"自然的"坐标系统中绘制. QPainter 一般在部件的绘图事件 ...
- QT 绘图橡皮擦效果的实现
QT绘图 橡皮擦效果的实现 前言 为了处理一些简单图片的后期处理,制作了一个简单的橡皮擦功能脚本.用来处理机器视觉中的图像处理. 开发工具 python版本: 3.6.5 相关模块: PyQt5 CV ...
- 使用Qt绘图制作一个钟表
使用Qt绘图制作一个钟表 实际效果如下: 一.钟表实现的大概思路 设置定时器,定时器每隔一秒调用repaint()函数,paintEvent()函数随即被调用,利用paintEvent()函数重绘钟表 ...
- Qt绘图:求圆和椭圆上任意角度点的坐标
(2021-2-11 之前把笛卡尔坐标的 x 和 y 标注反了,已修正) 0.圆相关公式 在笛卡尔坐标系上,一个标准的圆是这样的: 已知圆心坐标 (x0,y0),半径 R,角度 a,则圆边上点(x', ...
- Qt中QPainter的使用
Qt中QPainter的使用 GUI用户界面的优点是通过提供可视化的工具为客户提供便利的操作,界面上的按钮.编辑框等都是通过绘图得到的.Qt的二维绘图基本功能是使用QPainter在绘图设备上绘图,通 ...
- Qt 绘图坐标系转换
Qt 绘图坐标系转换 先上一段代码,简单的画了个实心矩形 QPainter paint(this);paint.setBrush(Qt::yellow);paint.drawRect(0.0, 0.0 ...
- QT 中QPainter绘制文字、图片
1. 把字符串绘制在QPixmap上 QPixmap MainWindow::text2Pixmap(QString text) { QFontMetrics fmt(m_font); QPixmap ...
- Qt 绝对要收藏的网站QTCN Qt绘图工具
最近在做一款画图软件,需要添加标尺,百度时发现了这个神仙网站QTCN 里面包括Qt作品展,Qt代码秀,Qt应用版 Qt绘图工具 源码下载网址:https://github.com/egan2015/q ...
最新文章
- 笔记本电脑设置触摸板双指滑动
- static的三种用法,定义静态变量,静态函数,静态代码块!
- 【[网络流二十四题]最长不下降子序列问题】
- 160 - 23 Chafe.1
- 安卓与HTML简单的交互使用
- 构造方法内的多态问题
- windows 下eclipse 连HBASE
- c#变量初始化的学习
- 【刷题】BZOJ 4503 两个串
- pmp 第六版 模拟卷5错题整理
- 最新树莓派系统PUTTY用默认用户名和密码登录不上的解决方法
- 世界上都有哪些常用的聊天软件?
- Oracle表归档,oracle数据库归档详解
- 一言不和就自己写了个编程语言
- 稀疏编码器(Sparse Encoder)
- 大数据风控AI竞赛总结
- Gitlab RCE CVE-2021-22205
- 我眼中的光明·第三周
- 交通信号灯的51仿真
- c++11新特性--decltype