这个例子我做了好几天:
1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化
2)网上的PyQt的例子根本运行不了
填了无数个坑,结合二者,终于能完成了一个关于绘图的东西。这个过程也掌握了很多新的知识点
【知识点】
1、关于多个点的使用
poitns = [QPoint(10,80),QPoint(20,10),QPoint(80,30),QPoint(90,70)]
请看:
# 定义多个点 points = [QPoint(10,70)] # ===直接使用 points 会报错!========= # ... elif self.shape == self.Points: painter.drawPoints(points) elif self.shape == self.polyline: painter.drawpolyline(points) elif self.shape == self.polygon: painter.drawpolygon(points,4) # ... # ===把 points 用 Qpolygon()包裹起来才正确!========= # ... elif self.shape == self.Points: painter.drawPoints(Qpolygon(points)) elif self.shape == self.polyline: painter.drawpolyline(Qpolygon(points)) elif self.shape == self.polygon: painter.drawpolygon(Qpolygon(points),4) # ...
2、在QDialog窗体中显示QWidget部件
【效果图】
【资源】
http://files.jb51.net/file_images/article/201710/brick.png
http://files.jb51.net/file_images/article/201710/qt-logo.png
【代码】
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.setMargin(10) 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,contentCol) mainLayout.addWidget(label2,2,labelCol) mainLayout.addWidget(self.widthSpinBox,contentCol) mainLayout.addWidget(label3,4,labelCol) mainLayout.addWidget(self.penColorFrame,contentCol) mainLayout.addWidget(self.penColorPushButton,3) mainLayout.addWidget(label4,6,labelCol) mainLayout.addWidget(self.penStyleComboBox,contentCol) mainLayout.addWidget(label5,8,labelCol) mainLayout.addWidget(self.penCapComboBox,contentCol) mainLayout.addWidget(label6,10,labelCol) mainLayout.addWidget(self.penJoinComboBox,contentCol) mainLayout.addWidget(label7,12,labelCol) mainLayout.addWidget(self.brushStyleComboBox,contentCol) mainLayout.addWidget(label8,14,labelCol) mainLayout.addWidget(self.brushColorFrame,contentCol) mainLayout.addWidget(self.brushColorPushButton,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.setMargin(10) mainLayout1.setSpacing(6) mainLayout1.addWidget(stack1) layout = qgridLayout(self) layout.addWidget(mainSplitter1,0) layout.addWidget(mainSplitter,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,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,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) path.moveto(100,100) path.cubicTo(300,300) path.cubicTo(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,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,spanAngle) elif self.shape == "Chord": p.drawChord(rect,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,Qpixmap("images/qt-logo.png")) if __name__=='__main__': app = QApplication(sys.argv) form = StockDialog() form.show() app.exec_()
以上这篇PyQt5利用QPainter绘制各种图形的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。