'https://www.cnblogs.com/hhh5460/p/4273799.html'
import sys
from PyQt5
.QtCore 
import *
from PyQt5
.QtGui 
import *
from PyQt5
.QtWidgets 
import *
class StockDialog(QWidget
):
    def __init__(self
, parent
=None):
        super(StockDialog
, self
).__init__
(parent
)
        self
.setWindowTitle
("利用QPainter绘制各种图形")
        mainSplitter 
= QSplitter
(Qt
.Horizontal
)
        mainSplitter
.setOpaqueResize
(True)
        frame 
= QFrame
(mainSplitter
)
        mainLayout 
= QGridLayout
(frame
)
        
        mainLayout
.setSpacing
(6)
        label1 
= QLabel
("形状:")
        label2 
= QLabel
("画笔线宽:")
        label3 
= QLabel
("画笔颜色:")
        label4 
= QLabel
("画笔风格:")
        label5 
= QLabel
("画笔顶端:")
        label6 
= QLabel
("画笔连接点:")
        label7 
= QLabel
("画刷风格:")
        label8 
= QLabel
("画刷颜色:")
        self
.shapeComboBox 
= QComboBox
()
        self
.shapeComboBox
.addItem
("Line", "Line")
        self
.shapeComboBox
.addItem
("Rectangle", "Rectangle")
        self
.shapeComboBox
.addItem
('Rounded Rectangle', 'Rounded Rectangle')
        self
.shapeComboBox
.addItem
('Ellipse', 'Ellipse')
        self
.shapeComboBox
.addItem
('Pie', 'Pie')
        self
.shapeComboBox
.addItem
('Chord', 'Chord')
        self
.shapeComboBox
.addItem
('Path', 'Path')
        self
.shapeComboBox
.addItem
('Polygon', 'Polygon')
        self
.shapeComboBox
.addItem
('Polyline', 'Polyline')
        self
.shapeComboBox
.addItem
('Arc', 'Arc')
        self
.shapeComboBox
.addItem
('Points', 'Points')
        self
.shapeComboBox
.addItem
('Text', 'Text')
        self
.shapeComboBox
.addItem
('Pixmap', 'Pixmap')
        self
.widthSpinBox 
= QSpinBox
()
        self
.widthSpinBox
.setRange
(0, 20)
        self
.penColorFrame 
= QFrame
()
        self
.penColorFrame
.setAutoFillBackground
(True)
        self
.penColorFrame
.setPalette
(QPalette
(Qt
.blue
))
        self
.penColorPushButton 
= QPushButton
("更改")
        self
.penStyleComboBox 
= QComboBox
()
        self
.penStyleComboBox
.addItem
("Solid", Qt
.SolidLine
)
        self
.penStyleComboBox
.addItem
('Dash', Qt
.DashLine
)
        self
.penStyleComboBox
.addItem
('Dot', Qt
.DotLine
)
        self
.penStyleComboBox
.addItem
('Dash Dot', Qt
.DashDotLine
)
        self
.penStyleComboBox
.addItem
('Dash Dot Dot', Qt
.DashDotDotLine
)
        self
.penStyleComboBox
.addItem
('None', Qt
.NoPen
)
        self
.penCapComboBox 
= QComboBox
()
        self
.penCapComboBox
.addItem
("Flat", Qt
.FlatCap
)
        self
.penCapComboBox
.addItem
('Square', Qt
.SquareCap
)
        self
.penCapComboBox
.addItem
('Round', Qt
.RoundCap
)
        self
.penJoinComboBox 
= QComboBox
()
        self
.penJoinComboBox
.addItem
("Miter", Qt
.MiterJoin
)
        self
.penJoinComboBox
.addItem
('Bebel', Qt
.BevelJoin
)
        self
.penJoinComboBox
.addItem
('Round', Qt
.RoundJoin
)
        self
.brushStyleComboBox 
= QComboBox
()
        self
.brushStyleComboBox
.addItem
("Linear Gradient", Qt
.LinearGradientPattern
)
        self
.brushStyleComboBox
.addItem
('Radial Gradient', Qt
.RadialGradientPattern
)
        self
.brushStyleComboBox
.addItem
('Conical Gradient', Qt
.ConicalGradientPattern
)
        self
.brushStyleComboBox
.addItem
('Texture', Qt
.TexturePattern
)
        self
.brushStyleComboBox
.addItem
('Solid', Qt
.SolidPattern
)
        self
.brushStyleComboBox
.addItem
('Horizontal', Qt
.HorPattern
)
        self
.brushStyleComboBox
.addItem
('Vertical', Qt
.VerPattern
)
        self
.brushStyleComboBox
.addItem
('Cross', Qt
.CrossPattern
)
        self
.brushStyleComboBox
.addItem
('Backward Diagonal', Qt
.BDiagPattern
)
        self
.brushStyleComboBox
.addItem
('Forward Diagonal', Qt
.FDiagPattern
)
        self
.brushStyleComboBox
.addItem
('Diagonal Cross', Qt
.DiagCrossPattern
)
        self
.brushStyleComboBox
.addItem
('Dense 1', Qt
.Dense1Pattern
)
        self
.brushStyleComboBox
.addItem
('Dense 2', Qt
.Dense2Pattern
)
        self
.brushStyleComboBox
.addItem
('Dense 3', Qt
.Dense3Pattern
)
        self
.brushStyleComboBox
.addItem
('Dense 4', Qt
.Dense4Pattern
)
        self
.brushStyleComboBox
.addItem
('Dense 5', Qt
.Dense5Pattern
)
        self
.brushStyleComboBox
.addItem
('Dense 6', Qt
.Dense6Pattern
)
        self
.brushStyleComboBox
.addItem
('Dense 7', Qt
.Dense7Pattern
)
        self
.brushStyleComboBox
.addItem
('None', Qt
.NoBrush
)
        self
.brushColorFrame 
= QFrame
()
        self
.brushColorFrame
.setAutoFillBackground
(True)
        self
.brushColorFrame
.setPalette
(QPalette
(Qt
.green
))
        self
.brushColorPushButton 
= QPushButton
("更改")
        labelCol 
= 0
        contentCol 
= 1
        
        mainLayout
.addWidget
(label1
, 1, labelCol
)
        mainLayout
.addWidget
(self
.shapeComboBox
, 1, contentCol
)
        mainLayout
.addWidget
(label2
, 2, labelCol
)
        mainLayout
.addWidget
(self
.widthSpinBox
, 2, contentCol
)
        mainLayout
.addWidget
(label3
, 4, labelCol
)
        mainLayout
.addWidget
(self
.penColorFrame
, 4, contentCol
)
        mainLayout
.addWidget
(self
.penColorPushButton
, 4, 3)
        mainLayout
.addWidget
(label4
, 6, labelCol
)
        mainLayout
.addWidget
(self
.penStyleComboBox
, 6, contentCol
)
        mainLayout
.addWidget
(label5
, 8, labelCol
)
        mainLayout
.addWidget
(self
.penCapComboBox
, 8, contentCol
)
        mainLayout
.addWidget
(label6
, 10, labelCol
)
        mainLayout
.addWidget
(self
.penJoinComboBox
, 10, contentCol
)
        mainLayout
.addWidget
(label7
, 12, labelCol
)
        mainLayout
.addWidget
(self
.brushStyleComboBox
, 12, contentCol
)
        mainLayout
.addWidget
(label8
, 14, labelCol
)
        mainLayout
.addWidget
(self
.brushColorFrame
, 14, contentCol
)
        mainLayout
.addWidget
(self
.brushColorPushButton
, 14, 3)
        mainSplitter1 
= QSplitter
(Qt
.Horizontal
)
        mainSplitter1
.setOpaqueResize
(True)
        stack1 
= QStackedWidget
()
        stack1
.setFrameStyle
(QFrame
.Panel 
| QFrame
.Raised
)
        self
.area 
= PaintArea
()
        stack1
.addWidget
(self
.area
)
        frame1 
= QFrame
(mainSplitter1
)
        mainLayout1 
= QVBoxLayout
(frame1
)
        
        mainLayout1
.setSpacing
(6)
        mainLayout1
.addWidget
(stack1
)
        layout 
= QGridLayout
(self
)
        layout
.addWidget
(mainSplitter1
, 0, 0)
        layout
.addWidget
(mainSplitter
, 0, 1)
        self
.setLayout
(layout
)
        
        self
.shapeComboBox
.activated
.connect
(self
.slotShape
)
        self
.widthSpinBox
.valueChanged
.connect
(self
.slotPenWidth
)
        self
.penColorPushButton
.clicked
.connect
(self
.slotPenColor
)
        self
.penStyleComboBox
.activated
.connect
(self
.slotPenStyle
)
        self
.penCapComboBox
.activated
.connect
(self
.slotPenCap
)
        self
.penJoinComboBox
.activated
.connect
(self
.slotPenJoin
)
        self
.brushStyleComboBox
.activated
.connect
(self
.slotBrush
)
        self
.brushColorPushButton
.clicked
.connect
(self
.slotBrushColor
)
        self
.slotShape
(self
.shapeComboBox
.currentIndex
())
        self
.slotPenWidth
(self
.widthSpinBox
.value
())
        self
.slotBrush
(self
.brushStyleComboBox
.currentIndex
())
    def slotShape(self
, value
):
        shape 
= self
.area
.Shape
[value
]
        self
.area
.setShape
(shape
)
    def slotPenWidth(self
, value
):
        color 
= self
.penColorFrame
.palette
().color
(QPalette
.Window
)
        style 
= Qt
.PenStyle
(self
.penStyleComboBox
.itemData
(self
.penStyleComboBox
.currentIndex
(), Qt
.UserRole
))
        cap 
= Qt
.PenCapStyle
(self
.penCapComboBox
.itemData
(self
.penCapComboBox
.currentIndex
(), Qt
.UserRole
))
        join 
= Qt
.PenJoinStyle
(self
.penJoinComboBox
.itemData
(self
.penJoinComboBox
.currentIndex
(), Qt
.UserRole
))
        self
.area
.setPen
(QPen
(color
, value
, style
, cap
, join
))
    def slotPenStyle(self
, value
):
        self
.slotPenWidth
(value
)
    def slotPenCap(self
, value
):
        self
.slotPenWidth
(value
)
    def slotPenJoin(self
, value
):
        self
.slotPenWidth
(value
)
    def slotPenColor(self
):
        color 
= QColorDialog
.getColor
(Qt
.blue
)
        self
.penColorFrame
.setPalette
(QPalette
(color
))
        self
.area
.setPen
(QPen
(color
))
    def slotBrushColor(self
):
        color 
= QColorDialog
.getColor
(Qt
.blue
)
        self
.brushColorFrame
.setPalette
(QPalette
(color
))
        self
.slotBrush
(self
.brushStyleComboBox
.currentIndex
())
    def slotBrush(self
, value
):
        color 
= self
.brushColorFrame
.palette
().color
(QPalette
.Window
)
        style 
= Qt
.BrushStyle
(self
.brushStyleComboBox
.itemData
(value
, Qt
.UserRole
))
        if (style 
== Qt
.LinearGradientPattern
):
            linearGradient 
= QLinearGradient
(0, 0, 400, 400)
            linearGradient
.setColorAt
(0.0, Qt
.white
)
            linearGradient
.setColorAt
(0.2, color
)
            linearGradient
.setColorAt
(1.0, Qt
.black
)
            self
.area
.setBrush
(linearGradient
)
        elif style 
== Qt
.RadialGradientPattern
:
            radialGradient 
= QRadialGradient
(200, 200, 80, 70, 70);
            radialGradient
.setColorAt
(0.0, Qt
.white
)
            radialGradient
.setColorAt
(0.2, Qt
.green
)
            radialGradient
.setColorAt
(1.0, Qt
.black
)
            self
.area
.setBrush
(radialGradient
)
        elif (style 
== Qt
.ConicalGradientPattern
):
            conicalGradient 
= QConicalGradient
(200, 200, 30)
            conicalGradient
.setColorAt
(0.0, Qt
.white
)
            conicalGradient
.setColorAt
(0.2, color
)
            conicalGradient
.setColorAt
(1.0, Qt
.black
)
            self
.area
.setBrush
(conicalGradient
)
        elif (style 
== Qt
.TexturePattern
):
            self
.area
.setBrush
(QBrush
(QPixmap
("images/brick.png")))
        else:
            self
.area
.setBrush
(QBrush
(color
, style
))
class PaintArea(QWidget
):
    def __init__(self
):
        super(PaintArea
, self
).__init__
()
        self
.Shape 
= ["Line", "Rectangle", 'Rounded Rectangle', "Ellipse", "Pie", 'Chord',
                      "Path", "Polygon", "Polyline", "Arc", "Points", "Text", "Pixmap"]
        self
.setPalette
(QPalette
(Qt
.white
))
        self
.setAutoFillBackground
(True)
        self
.setMinimumSize
(400, 400)
        self
.pen 
= QPen
()
        self
.brush 
= QBrush
()
    def setShape(self
, s
):
        self
.shape 
= s
        self
.update
()
    def setPen(self
, p
):
        self
.pen 
= p
        self
.update
()
    def setBrush(self
, b
):
        self
.brush 
= b
        self
.update
()
    def paintEvent(self
, QPaintEvent
):
        p 
= QPainter
(self
)
        p
.setPen
(self
.pen
)
        p
.setBrush
(self
.brush
)
        rect 
= QRect
(50, 100, 300, 200)
        points 
= [QPoint
(150, 100), QPoint
(300, 150), QPoint
(350, 250), QPoint
(100, 300)]
        startAngle 
= 30 * 16
        spanAngle 
= 120 * 16
        path 
= QPainterPath
();
        path
.addRect
(150, 150, 100, 100)
        path
.moveTo
(100, 100)
        path
.cubicTo
(300, 100, 200, 200, 300, 300)
        path
.cubicTo
(100, 300, 200, 200, 100, 100)
        if self
.shape 
== "Line":
            p
.drawLine
(rect
.topLeft
(), rect
.bottomRight
())
        elif self
.shape 
== "Rectangle":
            p
.drawRect
(rect
)
        elif self
.shape 
== 'Rounded Rectangle':
            p
.drawRoundedRect
(rect
, 25, 25, Qt
.RelativeSize
)
        elif self
.shape 
== "Ellipse":
            p
.drawEllipse
(rect
)
        elif self
.shape 
== "Polygon":
            p
.drawPolygon
(QPolygon
(points
), Qt
.WindingFill
)
        elif self
.shape 
== "Polyline":
            p
.drawPolyline
(QPolygon
(points
))
        elif self
.shape 
== "Points":
            p
.drawPoints
(QPolygon
(points
))
        elif self
.shape 
== "Pie":
            p
.drawPie
(rect
, startAngle
, spanAngle
)
        elif self
.shape 
== "Arc":
            p
.drawArc
(rect
, startAngle
, spanAngle
)
        elif self
.shape 
== "Chord":
            p
.drawChord
(rect
, startAngle
, spanAngle
)
        elif self
.shape 
== "Path":
            p
.drawPath
(path
)
        elif self
.shape 
== "Text":
            p
.drawText
(rect
, Qt
.AlignCenter
, "Hello Qt!")
        elif self
.shape 
== "Pixmap":
            p
.drawPixmap
(150, 150, QPixmap
("images/qt-logo.png"))
if __name__ 
== '__main__':
    app 
= QApplication
(sys
.argv
)
    form 
= StockDialog
()
    form
.show
()
    app
.exec_
()
                
                
                
        
    
 
转载请注明原文地址:https://tech.qufami.com/read-22512.html