zoukankan      html  css  js  c++  java
  • 绘图QPainter-画笔

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

    画笔样式Penstyle

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

    Qt.SolidLine  一条简单的线    

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

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

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

    Qt.DashDotDotLine  一条短线,两个点    

    Qt.MpenStyle   画笔风格的掩码     

    Qt.CustomDashLine   自定义样式   

      

     三种笔端样式:

     

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

     

     1 import sys
     2 from PyQt5.QtCore import Qt
     3 from PyQt5.QtGui import QPainter, QPen,QPolygon,QColor
     4 from PyQt5.QtWidgets import QApplication, QWidget
     5 
     6 
     7 class Demo(QWidget):
     8     def __init__(self):
     9         super(Demo, self).__init__()
    10         self.resize(600, 600)
    11 
    12         self.pen1 = QPen()  # 实例化画笔对象
    13         self.pen1.setColor(Qt.green)  #设置画笔颜色
    14         self.pen2 = QPen(Qt.SolidLine)  #实例化画笔对象.参数:画笔样式
    15         self.pen2.setWidth(3) #设置画笔粗细
    16         #传入整型值,默认为1。如果要传入浮点型的话可使用setWidthF()
    17         # self.pen2.setWidthF(3.3)
    18 
    19         self.pen3 = QPen(Qt.DashLine)
    20         self.pen4 = QPen(Qt.DotLine)
    21         self.pen5 = QPen(Qt.DashDotLine)
    22         self.pen6 = QPen(Qt.DashDotDotLine)
    23         self.pen7 = QPen(Qt.CustomDashLine)
    24         #自定义样式的话,我们之后还需要调用setDashPattern()方法来设置虚线模式。只要传入一个迭代器即可,这里我们传入[6, 2, 18, 2](元素数量为偶数)这个列表,意思是我们想将第一个虚线长度设为6个像素,再设置空白间隔长度为2个像素,之后再画一条长度为18像素的虚线,最后再加个长度为2像素的空白间隔,如此循环
    25         self.pen7.setDashPattern([6, 2, 18, 2])
    26 
    27         self.pen8 = QPen(Qt.SolidLine)
    28         self.pen8.setWidth(6)
    29         self.pen8.setCapStyle(Qt.RoundCap)  #设置笔端样式
    30 
    31         self.pen9 = QPen(Qt.SolidLine)
    32         self.pen9.setWidthF(3)
    33         self.pen9.setJoinStyle(Qt.MiterJoin)  #设置线条连接方式
    34 
    35     def paintEvent(self, QPaintEvent):  #绘画事件
    36         painter = QPainter(self)  # 实例化一个画布【个人:画布指令只能在绘图事件中】
    37         painter.setPen(self.pen1)  #给画布设置画笔
    38         painter.drawLine(100, 10, 500, 10) #画直线。参数:两个点的坐标
    39         #绘制一条指定了端点坐标的线,绘制从(x1,y1)到(x2,y2)的直线并且设置当前画笔位置为(x2,y2)     #painter.drawLine(self.begin_point, self.end_point)   #画直线      #参数是QPoint点坐标对象对象
    40         # painter.setPen(self.pen2)
    41         # painter.drawLine(100, 30, 500, 30)
    42         #
    43         # painter.setPen(self.pen3)
    44         # painter.drawLine(100, 50, 500, 50)
    45         #
    46         # painter.setPen(self.pen4)
    47         # painter.drawLine(100, 70, 500, 70)
    48         #
    49         # painter.setPen(self.pen5)
    50         # painter.drawLine(100, 90, 500, 90)
    51         #
    52         # painter.setPen(self.pen6)
    53         # painter.drawLine(100, 110, 500, 110)
    54         #
    55         # painter.setPen(self.pen7)
    56         # painter.drawLine(100, 130, 500, 130)
    57         #
    58         # painter.setPen(self.pen8)
    59         # painter.drawLine(100, 150, 500, 150)
    60 
    61         painter.setPen(self.pen2)
    62         #painter.drawRect(100, 50, 400, 100)  # 画矩形
    63         #参数1 参数2:矩形左上角坐标
    64         #参数3 参数4 宽度  高度
    65 
    66         #painter.drawArc(0,0,200,200,0*16,90*16) #画弧形
    67         #参数1 参数2  矩形左上角坐标
    68         #参数3 参数4 矩形的宽和高
    69         #参数5 参数6  0  90 是角度
    70 
    71         #painter.drawEllipse(0, 0, 200, 100)  #画椭圆
    72         #参数1 参数2  矩形左上角坐标
    73         #参数3 参数4 矩形的宽和高
    74 
    75         # polygon = QPolygon()  #实例化一个多边形
    76         # polygon.setPoints(5, 100, 100, 140, 130, 160, 160, 170, 140, 140, 178,0)
    77         # #给多边形按顺序加坐标
    78         # painter.drawPolygon(polygon)  #画多边形
    79 
    80         #painter.drawPie(100, 100, 200, 200, 0 * 16, 90 * 16)  #画扇形
    81         # 参数1 参数2  矩形左上角坐标
    82         # 参数3 参数4 矩形的宽和高
    83         #0  90  是角度
    84 
    85         painter.fillRect(100, 50, 400, 100,QColor(Qt.red))  #填充矩形
    86         # 参数1 参数2  矩形左上角坐标
    87         # 参数3 参数4 矩形的宽和高
    88         #参数5  填充色
    89 
    90 
    91 if __name__ == '__main__':
    92     app = QApplication(sys.argv)
    93     demo = Demo()
    94     demo.show()
    95     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()函数

  • 相关阅读:
    个人阅读作业1
    个人项目-词频统计
    Android中BroadcastReceiver的两种注册方式(静态和动态)详解
    JAVA装饰者模式(从现实生活角度理解代码原理)
    博客维护停止,需要的伙伴们移步http://blog.csdn.net/panhouye
    Android中EditText设置输入条件
    Andriod中自定义Dialog样式的Activity点击空白处隐藏软件盘(Dialog不消失)
    Android中调用文件管理器并返回选中文件的路径
    java中打印实心菱形以及空心菱形的方法
    Android中使用findViewByMe提升组件查找效率
  • 原文地址:https://www.cnblogs.com/liming19680104/p/10400399.html
Copyright © 2011-2022 走看看