绘图要在paintEvent()方法中实现。在QPainter对象的begin()与end()方法间编写绘图代码。它会在控件或其他图形设备上进行低级的图形绘制

画笔样式Penstyle

Qt.Nopen      没有线。比如QPainter.drawRect()填充,但没有绘制任何边界线

Qt.SolidLine  一条简单的线    

Qt.DashLine   有一些像素分割的线    

Qt.DotLine  有一些像素分割的点    

Qt.DashDotLine   轮流交替的点和短线      

Qt.DashDotDotLine  一条短线,两个点    

Qt.MpenStyle   画笔风格的掩码

Qt.CustomDashLine   自定义样式

三种笔端样式:

线条连接方式,一共有三种:

 import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QPen,QPolygon,QColor
from PyQt5.QtWidgets import QApplication, QWidget class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600) self.pen1 = QPen() # 实例化画笔对象
self.pen1.setColor(Qt.green) #设置画笔颜色
self.pen2 = QPen(Qt.SolidLine) #实例化画笔对象.参数:画笔样式
self.pen2.setWidth(3) #设置画笔粗细
#传入整型值,默认为1。如果要传入浮点型的话可使用setWidthF()
# self.pen2.setWidthF(3.3) self.pen3 = QPen(Qt.DashLine)
self.pen4 = QPen(Qt.DotLine)
self.pen5 = QPen(Qt.DashDotLine)
self.pen6 = QPen(Qt.DashDotDotLine)
self.pen7 = QPen(Qt.CustomDashLine)
#自定义样式的话,我们之后还需要调用setDashPattern()方法来设置虚线模式。只要传入一个迭代器即可,这里我们传入[6, 2, 18, 2](元素数量为偶数)这个列表,意思是我们想将第一个虚线长度设为6个像素,再设置空白间隔长度为2个像素,之后再画一条长度为18像素的虚线,最后再加个长度为2像素的空白间隔,如此循环
self.pen7.setDashPattern([6, 2, 18, 2])

self.pen8 = QPen(Qt.SolidLine)
self.pen8.setWidth(6)
self.pen8.setCapStyle(Qt.RoundCap) #设置笔端样式 self.pen9 = QPen(Qt.SolidLine)
self.pen9.setWidthF(3)
self.pen9.setJoinStyle(Qt.MiterJoin) #设置线条连接方式 def paintEvent(self, QPaintEvent): #绘画事件
painter = QPainter(self) # 实例化一个画布【个人:画布指令只能在绘图事件中】
painter.setPen(self.pen1) #给画布设置画笔
painter.drawLine(100, 10, 500, 10) #画直线。参数:两个点的坐标
#绘制一条指定了端点坐标的线,绘制从(x1,y1)到(x2,y2)的直线并且设置当前画笔位置为(x2,y2)     #painter.drawLine(self.begin_point, self.end_point) #画直线      #参数是QPoint点坐标对象对象
# painter.setPen(self.pen2)
# painter.drawLine(100, 30, 500, 30)
#
# painter.setPen(self.pen3)
# painter.drawLine(100, 50, 500, 50)
#
# painter.setPen(self.pen4)
# painter.drawLine(100, 70, 500, 70)
#
# painter.setPen(self.pen5)
# painter.drawLine(100, 90, 500, 90)
#
# painter.setPen(self.pen6)
# painter.drawLine(100, 110, 500, 110)
#
# painter.setPen(self.pen7)
# painter.drawLine(100, 130, 500, 130)
#
# painter.setPen(self.pen8)
# painter.drawLine(100, 150, 500, 150) painter.setPen(self.pen2)
#painter.drawRect(100, 50, 400, 100) # 画矩形
#参数1 参数2:矩形左上角坐标
#参数3 参数4 宽度 高度 #painter.drawArc(0,0,200,200,0*16,90*16) #画弧形
#参数1 参数2 矩形左上角坐标
#参数3 参数4 矩形的宽和高
#参数5 参数6 0 90 是角度 #painter.drawEllipse(0, 0, 200, 100) #画椭圆
#参数1 参数2 矩形左上角坐标
#参数3 参数4 矩形的宽和高 # polygon = QPolygon() #实例化一个多边形
# polygon.setPoints(5, 100, 100, 140, 130, 160, 160, 170, 140, 140, 178,0)
# #给多边形按顺序加坐标
# painter.drawPolygon(polygon) #画多边形 #painter.drawPie(100, 100, 200, 200, 0 * 16, 90 * 16) #画扇形
# 参数1 参数2 矩形左上角坐标
# 参数3 参数4 矩形的宽和高
#0 90 是角度 painter.fillRect(100, 50, 400, 100,QColor(Qt.red)) #填充矩形
# 参数1 参数2 矩形左上角坐标
# 参数3 参数4 矩形的宽和高
#参数5 填充色 if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())


 qp.drawPoint(x, y)     #画点

painter.drawRect(rect)   #画矩形

参数:QRect对象
  

触发绘图事件

1.在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件
2.当重新调整窗口部件的大小时,系统也会产生一个绘制事件
3.当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件
4.同时可以调用QWidget::update()或者QWidget::repaint()来强制产生一个绘制事件。二者的区别是:
repaint()被调用之后,立即执行重绘.update()调用之后并不是立即重绘,而是将重绘事件放入主消息循环中,由main的event loop来统一调度的(其实也是比较快的)。update在调用paintEvent之前,还做了很多优化,如果update被调用了很多次,最后这些 update会合并到一个大的重绘事件加入到消息队列,最后只有这个大的update被执行一次

注意:再次调用绘图事件后,原有的绘图全部清除

def paintEvent(self, QPaintEvent):带设备参数时会立即开始在设备上绘制,自动调用begin()函数,然后析构函数中调用end()函数结束绘制

              不带设备参数时,可以在后面调用QPainter::begin(QPaintDevice *device)来指定绘制设置,然后用完再调用end()函数

绘图QPainter-画笔的更多相关文章

  1. C# GDI绘图之——画笔和画刷

    绘制图形需要画笔和画刷: Pen(画笔类): Pen为C#编程语言中专门的画笔类 使用方式: // 用系统颜色来初始化我们的画笔类,使用Color静态类中的颜色 1. Pen p1 = new Pen ...

  2. C#绘图、画笔相关

    dg.SmoothingMode = SmoothingMode.HighSpeed; //高质量 dg.PixelOffsetMode = PixelOffsetMode.HighSpeed; // ...

  3. QPainter绘制遇到的小问题

    1.Qt绘图基础 (1)绘图需画笔和画布: QPainter 相当于Qt中的一个画笔,绘制时需要一块画布, Qt中扮演画布角色的组件为QPaintDevice和他的各个子类,如: QWidget, Q ...

  4. Android开发——绘图基础

    前言: Android中绘图基本三个类,分别是Paint(画笔),Path(路径),Canvas(画布),这三个也是自定义View经常会使用到的类 个人理解,Canvas画布这个翻译其实不太好,这个类 ...

  5. Windows的图形设备接口与Windows绘图

    本次学习目标 理解DC, 映像模式, 坐标系统, 窗口和视口; 学习获取绘图工具(画笔/画刷)的句柄, 设置颜色, 能定义映像模式; 会使用常用的绘图函数. 编写程序: 在屏幕上出现一个圆心沿正弦曲线 ...

  6. 2048游戏_QT实现

    #ifndef GAMEWIDGET_H #define GAMEWIDGET_H #include <QWidget> #include <QMouseEvent> #inc ...

  7. 每日一笔记之2:QT之坐标系统:

    以前一直多单片机开发,也没怎么使用过大的显示器,第一次学习,备忘: QT画图系统. 绘图,通过QPainter类实现. Qt的绘图系统对底层函数进行了良好的封装,使得在屏幕和设备的绘图功能可能使用相同 ...

  8. QT第六天学习

    基本事件: 鼠标事件 键盘事件 绘制事件 1.QT中的事件: 事件是对各应用程序需要知道的由应用程序内部或外部产生的事情或动作的通称. QT中事件的处理: 在QT中使用一个对象来表示一个事件,继承自Q ...

  9. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  10. QT 实现在QLabel上画图

    QT之所以不能再任意控件上绘图是因为QT的事件过滤器把控件的绘图事件给过滤了. 在paintevent()函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继 ...

随机推荐

  1. maven 引用另一个jar包 需要先打包在仓库里面 并在pom里面配置 才可以引用

    maven 引用另一个jar包 需要先打包在仓库里面 并在pom里面配置 才可以引用

  2. MySQL中char、varchar和nvarchar的区别

    一.char和varchar的区别char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度.1). 当字符串长度小于255时,用额 ...

  3. BZOJ2653middle——二分答案+可持久化线段树

    题目描述 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在 ...

  4. BZOJ3456 城市规划(多项式求逆)

    设f[i]为连通图的数量,g[i]为不连通图的数量,显然有f[i]=2i*(i-1)/2-g[i],g[i]通过枚举1所在连通块大小转移,有g[i]=Σf[j]*C(i-1,j-1)·2(i-j)*( ...

  5. The Chinese Postman Problem HIT - 2739(有向图中国邮路问题)

    无向图的问题,如果每个点的度数为偶数,则就是欧拉回路,而对于一个点只有两种情况,奇数和偶数,那么就把都为奇数的一对点  连一条  边权为原图中这两点最短路的值  的边  是不是就好了 无向图中国邮路问 ...

  6. 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)

    1.状压bfs 这个状压体现在key上  我i们用把key状压一下  就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...

  7. Minimum Cost POJ - 2516 (模板题 spfa最小费用最大流)

    题意: 人回家,一步一块钱,有x个人,y个房子,求能回家的最大人数且使之费用最小 解析: 就是....套模板,,,, 建图(⊙﹏⊙)...要仔细观察呐 对于人拆不拆都可以  都能过,,,,这里贴上拆开 ...

  8. Thymeleaf+SpringMVC,如何从模板中获取数据(转)

    在一个典型的SpringMVC应用中,带@Controller注解的类负责准备数据模型Map的数据和选择一个视图进行渲染.这个模型Map对视图进行完全的抽象,在使用Thymeleaf的情况下,它将是一 ...

  9. 读取Properties文件以及中文乱码问题

    在java类中常见的读取Properties文件方式,是使用Properties.load(inputStream);的方式但是常常出现中文乱码问题,这就很尴尬了 public synchronize ...

  10. 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)

    BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...