此项目是别人用Q开发的,我模仿用Pyqt编写。仿写过程种发下c++ 和python在调用时还是有些不一样。遇到行不通时就要多尝试别的方法。不如在C++里可以直接在cpp文件里传入QBrush和QPen对象,而在python里就不行,估计使用信号与槽可以(本人还没尝试,有机会试下)。
def pen_change(self):
self.color=QColorDialog().getColor(QColor(255,0,0),self,'画笔颜色')
# print(self.color)
# 判断颜色是否有效,无效返回
if not self.color.isValid():
return
print('ok')
#把颜色回显到按钮上
pal=self.pen_color_btn.palette()
pal.setColor(QPalette.Button,self.color)
self.pen_color_btn.setPalette(pal)
self.pen_color_btn.setAutoFillBackground(True) #标志位
self.pen_color_btn.setFlat(True)
def brush_changed(self):
#获取画刷颜色
pal=self.brush_color_btn.palette()
color=pal.color(QPalette.Button)
#获取画刷样式
brush_index=self.brush_style_combox.currentIndex()
style=self.brush_style_combox.itemData(brush_index)
#设置画刷
self.paint_window.set_Brush(color,style)
用设计师设计界面
![](https://img-blog.csdnimg.cn/img_convert/0c13f8b49ec8593b9e46a594eb4d9e62.png)
保存ui文件并生成py文件,然后建立一个文件,继承该文件,这样就实现了界面和逻辑代码分离。然后添加初始化数据,这里数据可以直接在设计师里添加,我这里用代码添加。如下
设计师生成的paintPane.py文件
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'paintPane.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(940, 650)
self.horizontalLayoutWidget = QtWidgets.QWidget(Form)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 10, 661, 61))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
font = QtGui.QFont()
font.setFamily("AcadEref")
font.setPointSize(14)
self.label.setFont(font)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.shape_combox = QtWidgets.QComboBox(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.shape_combox.sizePolicy().hasHeightForWidth())
self.shape_combox.setSizePolicy(sizePolicy)
self.shape_combox.setMinimumSize(QtCore.QSize(50, 30))
self.shape_combox.setObjectName("shape_combox")
self.horizontalLayout.addWidget(self.shape_combox)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem2)
self.paint_window = PaintWidget(Form)
self.paint_window.setGeometry(QtCore.QRect(10, 100, 891, 391))
self.paint_window.setObjectName("paint_window")
self.groupBox_3 = QtWidgets.QGroupBox(Form)
self.groupBox_3.setGeometry(QtCore.QRect(690, 500, 191, 143))
self.groupBox_3.setObjectName("groupBox_3")
self.checkBox = QtWidgets.QCheckBox(self.groupBox_3)
self.checkBox.setGeometry(QtCore.QRect(20, 30, 161, 41))
self.checkBox.setObjectName("checkBox")
self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox_3)
self.checkBox_2.setGeometry(QtCore.QRect(20, 90, 71, 16))
self.checkBox_2.setObjectName("checkBox_2")
self.groupBox = QtWidgets.QGroupBox(Form)
self.groupBox.setGeometry(QtCore.QRect(10, 510, 361, 131))
self.groupBox.setObjectName("groupBox")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout.setObjectName("gridLayout")
self.label_2 = QtWidgets.QLabel(self.groupBox)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
self.width_spinbox = QtWidgets.QSpinBox(self.groupBox)
self.width_spinbox.setMinimum(1)
self.width_spinbox.setMaximum(10)
self.width_spinbox.setObjectName("width_spinbox")
self.gridLayout.addWidget(self.width_spinbox, 0, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(self.groupBox)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 0, 2, 1, 1)
self.jon_combox = QtWidgets.QComboBox(self.groupBox)
self.jon_combox.setObjectName("jon_combox")
self.gridLayout.addWidget(self.jon_combox, 0, 3, 1, 1)
self.label_3 = QtWidgets.QLabel(self.groupBox)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.color_btn = QtWidgets.QPushButton(self.groupBox)
self.color_btn.setText("")
self.color_btn.setObjectName("color_btn")
self.gridLayout.addWidget(self.color_btn, 1, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.groupBox)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 1, 2, 1, 1)
self.end_combox = QtWidgets.QComboBox(self.groupBox)
self.end_combox.setObjectName("end_combox")
self.gridLayout.addWidget(self.end_combox, 1, 3, 1, 1)
self.label_4 = QtWidgets.QLabel(self.groupBox)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1)
self.style_combox = QtWidgets.QComboBox(self.groupBox)
self.style_combox.setObjectName("style_combox")
self.gridLayout.addWidget(self.style_combox, 2, 1, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(Form)
self.groupBox_2.setGeometry(QtCore.QRect(390, 510, 241, 131))
self.groupBox_2.setObjectName("groupBox_2")
self.label_7 = QtWidgets.QLabel(self.groupBox_2)
self.label_7.setGeometry(QtCore.QRect(20, 30, 54, 12))
self.label_7.setObjectName("label_7")
self.label_8 = QtWidgets.QLabel(self.groupBox_2)
self.label_8.setGeometry(QtCore.QRect(20, 70, 54, 12))
self.label_8.setObjectName("label_8")
self.brush_color_btn = QtWidgets.QPushButton(self.groupBox_2)
self.brush_color_btn.setGeometry(QtCore.QRect(80, 30, 91, 23))
self.brush_color_btn.setText("")
self.brush_color_btn.setObjectName("brush_color_btn")
self.brush_style_combox = QtWidgets.QComboBox(self.groupBox_2)
self.brush_style_combox.setGeometry(QtCore.QRect(80, 70, 91, 22))
self.brush_style_combox.setObjectName("brush_style_combox")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "图形形状"))
self.groupBox_3.setTitle(_translate("Form", "高级选项"))
self.checkBox.setText(_translate("Form", "变换(缩放,平移)"))
self.checkBox_2.setText(_translate("Form", "抗锯齿"))
self.groupBox.setTitle(_translate("Form", "画笔"))
self.label_2.setText(_translate("Form", "宽度"))
self.label_5.setText(_translate("Form", "连接"))
self.label_3.setText(_translate("Form", "颜色"))
self.label_6.setText(_translate("Form", "末端"))
self.label_4.setText(_translate("Form", "样式"))
self.groupBox_2.setTitle(_translate("Form", "画刷"))
self.label_7.setText(_translate("Form", "颜色"))
self.label_8.setText(_translate("Form", "样式"))
from paintwindow import PaintWidget
为了使数据更有意义,我这里单独建立一个文件,比如Point代表0,LINE代表1,这样在后面代码中就可以使用,比如 if self.style==Point:pass elif self.style==Line:pass ,实际上是 if self.style==0:pass
elif self.style==1: pass
建立的style.py 文件
POINT = 0
LINE = 1
RECT = 2
ROUNDEDRECT = 3
ELLIPSE = 6
POLYLINE = 7
POLYGON = 8
ARC = 9
PIE = 4
CHORD = 10
PATH = 5
TEXT = 11
PIXMAP = 12
设计师里中间建立了一个widget用来绘制图形,主要的绘制工作都在这里完成,为了便于维护,就把它单独拿出来,然后在设计师里给该控件做提升,单独创建个paintWindow文件,创建一个PaintWidget对象,并继承QWidget,后面的图形代码都在这里完成。
![](https://img-blog.csdnimg.cn/img_convert/95b0329026c3aa8690cf90fc9f88c237.png)
这里传参要注意,之前看的是c++写的,pyqt写法有几个地方要注意,第一,在初始化时候要给默认值,然后再构造里在传值,如果不这样做可能会报错。第二要分开写,尝试在主界面里直接把QPen对象传过来,结果也是不行,不知道原因。先在这里记录一下测试代码
class PaintWidget(QWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.setAttribute(Qt.WA_StyledBackground, True)
self.setStyleSheet('background-color:cyan')
self.col = Qt.gray
self.w = 1
self.sty = Qt.SolidLine
self.setShape(6)
def setShape(self,shape:int):
self.shape=shape
self.update()
def setPen(self,color=Qt.gray,width=1,style=Qt.SolidLine):
self.col=color
self.w=width
self.sty=style
self.update()
def paintEvent(self, evt) -> None:
super().paintEvent(evt)
pen=QPen()
pen.setColor(self.col)
pen.setWidth(self.w)
pen.setStyle(self.sty)
painter=QPainter(self)
painter.setPen(pen)
if self.shape==POINT:
pass
elif self.shape==LINE:
painter.drawLine(10,70,50,10)
elif self.shape==RECT:
painter.drawRect(10,10,40,50)
elif self.shape==ROUNDEDRECT:
pass
elif self.shape==ELLIPSE:
painter.drawEllipse(10,10,60,60)
elif self.shape==POLYLINE:
pass
主文件里测试代码
@pyqtSlot(int)
def on_shape_combox_activated(self,index):
print(index)
self.paint_window.setShape(index)
self.paint_window.setPen(Qt.green,5,Qt.DotLine)#测试成功,然后就可以把界面参数拿过来
#然后在传过去
给画笔设置绑定函数
def penChanged(self):
pal=self.color_btn.palette() #拿到按钮调色板
color=pal.color(QPalette.Button)
width=self.width_spinbox.value()
#获取索引
style_index=self.style_combox.currentIndex()
# 拿到前面的值 :addItem('Solidline', Qt.SolidLine)
style=self.style_combox.itemData(style_index)
cap_index=self.end_combox.currentIndex()
cap=self.end_combox.itemData(cap_index)
join_style=self.jon_combox.currentIndex()
join=self.jon_combox.itemData(join_style)
#把参数传入到paintwindow,这里传参就分开了,没有直接传QPen(color,width,style,cap,join))
self.paint_window.setPen(color,width,style, cap, join)
![](https://img-blog.csdnimg.cn/img_convert/75ad8b3d41c564de825affdecdf1c343.png)
![](https://img-blog.csdnimg.cn/img_convert/0282e9bf7b121e370be516c516b679fa.png)
第一阶段成果
main.py
from PyQt5.Qt import *
from paintPane import Ui_Form
from style import *
class Window(QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.init_data()
#信号
self.color_btn.clicked.connect(self.pen_color_btn_click) #画笔颜色按钮
self.width_spinbox.valueChanged.connect(self.penChanged)
self.brush_color_btn.clicked.connect(self.brush_color_btn_click)
#初始化加载数据
def init_data(self):
#加载图形形状
self.shape_combox.addItem('point', POINT)
self.shape_combox.addItem('line', LINE)
self.shape_combox.addItem('rect', RECT)
self.shape_combox.addItem('roundrect', ROUNDEDRECT)
self.shape_combox.addItem('pie', PIE)
self.shape_combox.addItem('path', PATH)
self.shape_combox.addItem('ellipse', ELLIPSE)
self.shape_combox.addItem('poline', POLYLINE)
self.shape_combox.addItem('polygon', POLYGON)
self.shape_combox.addItem('arc', ARC)
self.shape_combox.addItem('chord', CHORD)
self.shape_combox.addItem('text', TEXT)
self.shape_combox.addItem('pixmap', PIXMAP)
#画笔样式加载数据
self.style_combox.addItem('Solidline', Qt.SolidLine)
self.style_combox.addItem('DashLine', Qt.DashLine)
self.style_combox.addItem('DotLine', Qt.DotLine)
self.style_combox.addItem('DashDotLine', Qt.DashDotLine)
self.style_combox.addItem('CustomDashLine', Qt.CustomDashLine)
#关联槽函数
self.style_combox.activated.connect(self.penChanged)
#画笔连接样式
self.jon_combox.addItem('Miter', Qt.MiterJoin)
self.jon_combox.addItem('Bevel', Qt.BevelJoin)
self.jon_combox.addItem('Round', Qt.RoundJoin)
# 关联槽函数
self.jon_combox.activated.connect(self.penChanged)
#画笔末端笔帽样式
self.end_combox.addItem('flat', Qt.FlatCap)
self.end_combox.addItem('Square', Qt.SquareCap)
self.end_combox.addItem('Round', Qt.RoundCap)
# 关联槽函数
self.end_combox.activated.connect(self.penChanged)
#画刷样式
# self.brush_style_combox.addItem('Qt.LinearGradientPattern', Qt.LinearGradientPattern)
# self.brush_style_combox.addItem('Qt.RadialGradientPattern', Qt.RadialGradientPattern)
# self.brush_style_combox.addItem('Qt.ConicalGradientPattern', Qt.ConicalGradientPattern)
# self.brush_style_combox.addItem('Qt.TexturePattern', Qt.TexturePattern)
self.brush_style_combox.addItem('Qt.SolidPattern',Qt.SolidPattern)
self.brush_style_combox.addItem('Qt.Dense1Pattern', Qt.Dense1Pattern)
self.brush_style_combox.addItem('Qt.Dense2Pattern', Qt.Dense2Pattern)
self.brush_style_combox.addItem('Qt.Dense3Pattern', Qt.Dense3Pattern)
self.brush_style_combox.addItem('Qt.Dense4Pattern', Qt.Dense4Pattern)
#关联信号与槽
self.brush_style_combox.activated.connect(self.brush_changed)
@pyqtSlot(int)
def on_shape_combox_activated(self,index):
print(index)
self.paint_window.setShape(index)
def penChanged(self):
pal=self.color_btn.palette() #拿到按钮调色板
color=pal.color(QPalette.Button)
width=self.width_spinbox.value()
#获取索引
style_index=self.style_combox.currentIndex()
# 拿到前面的值 :addItem('Solidline', Qt.SolidLine)
style=self.style_combox.itemData(style_index)
cap_index=self.end_combox.currentIndex()
cap=self.end_combox.itemData(cap_index)
join_style=self.jon_combox.currentIndex()
join=self.jon_combox.itemData(join_style)
#把参数传入到paintwindow
self.paint_window.setPen(color,width,style, cap, join)
def pen_color_btn_click(self):
color=QColorDialog().getColor(QColor(255,0,0),self,'画笔颜色')
#判断是否选择颜色
if not color.isValid():
return
#将颜色在按钮上显示
pal=self.color_btn.palette()
pal.setColor(QPalette.Button,color)
self.color_btn.setPalette(pal)
self.color_btn.setAutoFillBackground(True)#标记
self.color_btn.setFlat(True)
#调用penChanged触发
self.penChanged()
def brush_color_btn_click(self):
color = QColorDialog().getColor(QColor(255, 0, 0), self, '画刷颜色')
# 判断是否选择颜色
if not color.isValid():
return
# 将颜色在按钮上显示
pal = self.brush_color_btn.palette()
pal.setColor(QPalette.Button, color)
self.brush_color_btn.setPalette(pal)
self.brush_color_btn.setAutoFillBackground(True) # 标记
self.brush_color_btn.setFlat(True)
# 调用Changed触发
self.brush_changed()
def brush_changed(self):
#获取画刷颜色
pal=self.brush_color_btn.palette()
color=pal.color(QPalette.Button)
#获取画刷样式
brush_index=self.brush_style_combox.currentIndex()
style=self.brush_style_combox.itemData(brush_index)
#设置画刷
self.paint_window.set_Brush(color,style)
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=Window()
win.show()
sys.exit(app.exec_())
paintwindow.py
from PyQt5.Qt import *
from style import *
class PaintWidget(QWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.setAttribute(Qt.WA_StyledBackground, True)
self.setStyleSheet('background-color:white')
self.col = Qt.gray
self.w = 1
self.sty = Qt.SolidLine
self.cap = Qt.RoundCap
self.join = Qt.RoundJoin
#画刷初始化
self.co=Qt.green
self.str=Qt.NoBrush
self.setShape(POINT)
def setShape(self,shape:int):
self.shape=shape
self.update()
def setPen(self,color=Qt.gray,width=1,style=Qt.SolidLine,cap=Qt.RoundCap,join=Qt.RoundJoin):
self.col=color
self.w=width
self.sty=style
self.cap=cap # Qt.RoundJoin Qt.FlatCap Qt.SquareCap
self.join=join #Qt.BevelJoin Qt.MiterJoin Qt.RoundJoin
self.update()
def set_Brush(self,color,style):
self.co=color
self.str=style
self.update()
def paintEvent(self, evt) -> None:
super().paintEvent(evt)
pen=QPen()
pen.setColor(self.col)
pen.setWidth(self.w)
pen.setStyle(self.sty)
pen.setCapStyle(self.cap)
pen.setJoinStyle(self.join)
brush=QBrush()
brush.setColor(self.co)
brush.setStyle(self.str)
painter=QPainter(self)
painter.setPen(pen)
painter.setBrush(brush)
for x in range(int(self.width()/100)):
for y in range(int(self.height()/80)):
painter.save()
# 偏移
painter.translate(x * 100, y * 80)
if self.shape==POINT:
painter.drawPoint(QPoint(20,20))
elif self.shape==LINE:
painter.drawLine(10,70,50,10)
elif self.shape==RECT:
painter.drawRect(10,10,40,50)
elif self.shape==ROUNDEDRECT:
pass
elif self.shape==ELLIPSE:
painter.drawEllipse(10,10,60,60)
elif self.shape==POLYLINE:
pass
painter.restore()
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=PaintWidget()
win.show()
sys.exit(app.exec_())
证据抗锯齿,是否变换
![](https://img-blog.csdnimg.cn/img_convert/a759b9bd182929289639c948d93a1a88.png)
![](https://img-blog.csdnimg.cn/img_convert/176e1d0e1aa3137d276f9cb26b327147.png)
![](https://img-blog.csdnimg.cn/img_convert/79b6799f6b9a35966cb8527e7a929479.png)
![](https://img-blog.csdnimg.cn/img_convert/dc655fd3f251a882781f5b9d7128d693.png)
#根据自己定义是否变换
if self.istransform:
painter.translate(30,30)
painter.rotate(90)
painter.translate(-30,-30)
![](https://img-blog.csdnimg.cn/img_convert/870631082f3f02b28c773705f22481cf.png)
完整代码如下:main.py
from PyQt5.Qt import *
from paintPane import Ui_Form
from style import *
class Window(QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.init_data()
#信号
self.color_btn.clicked.connect(self.pen_color_btn_click) #画笔颜色按钮
self.width_spinbox.valueChanged.connect(self.penChanged)
self.brush_color_btn.clicked.connect(self.brush_color_btn_click)
self.checkBox_2.toggled.connect(self.antialiasChanged)#抗锯齿
self.checkBox.toggled.connect(self.transFormChanged) #平移 旋转
#初始化加载数据
def init_data(self):
#加载图形形状
self.shape_combox.addItem('point', POINT)
self.shape_combox.addItem('line', LINE)
self.shape_combox.addItem('rect', RECT)
self.shape_combox.addItem('roundrect', ROUNDEDRECT)
self.shape_combox.addItem('pie', PIE)
self.shape_combox.addItem('path', PATH)
self.shape_combox.addItem('ellipse', ELLIPSE)
self.shape_combox.addItem('poline', POLYLINE)
self.shape_combox.addItem('polygon', POLYGON)
self.shape_combox.addItem('arc', ARC)
self.shape_combox.addItem('chord', CHORD)
self.shape_combox.addItem('text', TEXT)
self.shape_combox.addItem('pixmap', PIXMAP)
#画笔样式加载数据
self.style_combox.addItem('Solidline', Qt.SolidLine)
self.style_combox.addItem('DashLine', Qt.DashLine)
self.style_combox.addItem('DotLine', Qt.DotLine)
self.style_combox.addItem('DashDotLine', Qt.DashDotLine)
self.style_combox.addItem('CustomDashLine', Qt.CustomDashLine)
#关联槽函数
self.style_combox.activated.connect(self.penChanged)
#画笔连接样式
self.jon_combox.addItem('Miter', Qt.MiterJoin)
self.jon_combox.addItem('Bevel', Qt.BevelJoin)
self.jon_combox.addItem('Round', Qt.RoundJoin)
# 关联槽函数
self.jon_combox.activated.connect(self.penChanged)
#画笔末端笔帽样式
self.end_combox.addItem('flat', Qt.FlatCap)
self.end_combox.addItem('Square', Qt.SquareCap)
self.end_combox.addItem('Round', Qt.RoundCap)
# 关联槽函数
self.end_combox.activated.connect(self.penChanged)
#画刷样式
# self.brush_style_combox.addItem('Qt.LinearGradientPattern', Qt.LinearGradientPattern)
# self.brush_style_combox.addItem('Qt.RadialGradientPattern', Qt.RadialGradientPattern)
# self.brush_style_combox.addItem('Qt.ConicalGradientPattern', Qt.ConicalGradientPattern)
# self.brush_style_combox.addItem('Qt.TexturePattern', Qt.TexturePattern)
self.brush_style_combox.addItem('Qt.SolidPattern',Qt.SolidPattern)
self.brush_style_combox.addItem('Qt.Dense1Pattern', Qt.Dense1Pattern)
self.brush_style_combox.addItem('Qt.Dense2Pattern', Qt.Dense2Pattern)
self.brush_style_combox.addItem('Qt.Dense3Pattern', Qt.Dense3Pattern)
self.brush_style_combox.addItem('Qt.Dense4Pattern', Qt.Dense4Pattern)
#关联信号与槽
self.brush_style_combox.activated.connect(self.brush_changed)
@pyqtSlot(int)
def on_shape_combox_activated(self,index):
# print(index)
self.paint_window.setShape(index)
def penChanged(self):
pal=self.color_btn.palette() #拿到按钮调色板
color=pal.color(QPalette.Button)
width=self.width_spinbox.value()
#获取索引
style_index=self.style_combox.currentIndex()
# 拿到前面的值 :addItem('Solidline', Qt.SolidLine)
style=self.style_combox.itemData(style_index)
cap_index=self.end_combox.currentIndex()
cap=self.end_combox.itemData(cap_index)
join_style=self.jon_combox.currentIndex()
join=self.jon_combox.itemData(join_style)
#把参数传入到paintwindow
self.paint_window.setPen(color,width,style, cap, join)
def pen_color_btn_click(self):
color=QColorDialog().getColor(QColor(255,0,0),self,'画笔颜色')
#判断是否选择颜色
if not color.isValid():
return
#将颜色在按钮上显示
pal=self.color_btn.palette()
pal.setColor(QPalette.Button,color)
self.color_btn.setPalette(pal)
self.color_btn.setAutoFillBackground(True)#标记
self.color_btn.setFlat(True)
#调用penChanged触发
self.penChanged()
def brush_color_btn_click(self):
color = QColorDialog().getColor(QColor(255, 0, 0), self, '画刷颜色')
# 判断是否选择颜色
if not color.isValid():
return
# 将颜色在按钮上显示
pal = self.brush_color_btn.palette()
pal.setColor(QPalette.Button, color)
self.brush_color_btn.setPalette(pal)
self.brush_color_btn.setAutoFillBackground(True) # 标记
self.brush_color_btn.setFlat(True)
# 调用Changed触发
self.brush_changed()
def brush_changed(self):
#获取画刷颜色
pal=self.brush_color_btn.palette()
color=pal.color(QPalette.Button)
#获取画刷样式
brush_index=self.brush_style_combox.currentIndex()
style=self.brush_style_combox.itemData(brush_index)
#设置画刷
self.paint_window.set_Brush(color,style)
def antialiasChanged(self,ischecked):
#调用paintWindow里的方法
# print(ischecked)
self.paint_window.setAntiAlias(ischecked)
def transFormChanged(self,ischecked):
self.paint_window.setTransForm(ischecked)
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=Window()
win.show()
sys.exit(app.exec_())
paintwindow.py
from PyQt5.Qt import *
from style import *
class PaintWidget(QWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.setAttribute(Qt.WA_StyledBackground, True)
self.setStyleSheet('background-color:white')
self.col = Qt.gray
self.w = 1
self.sty = Qt.SolidLine
self.cap = Qt.RoundCap
self.join = Qt.RoundJoin
#画刷初始化
self.co=Qt.green
self.str=Qt.NoBrush
#抗锯齿初始化
self.antialias=False
#是否平移
self.istransform = False
self.setShape(POINT)
def setShape(self,shape:int):
self.shape=shape
self.update()
def setPen(self,color=Qt.gray,width=1,style=Qt.SolidLine,cap=Qt.RoundCap,join=Qt.RoundJoin):
self.col=color
self.w=width
self.sty=style
self.cap=cap # Qt.RoundJoin Qt.FlatCap Qt.SquareCap
self.join=join #Qt.BevelJoin Qt.MiterJoin Qt.RoundJoin
self.update()
def set_Brush(self,color,style):
self.co=color
self.str=style
self.update()
def setAntiAlias(self,ischecked:bool):#是否抗锯齿
self.antialias=ischecked
self.update()
# print(self.antialias)
def setTransForm(self,ischecked:bool):#是否平移,旋转
self.istransform=ischecked
self.update()
def paintEvent(self, evt) -> None:
super().paintEvent(evt)
pen=QPen()
pen.setColor(self.col)
pen.setWidth(self.w)
pen.setStyle(self.sty)
pen.setCapStyle(self.cap)
pen.setJoinStyle(self.join)
brush=QBrush()
brush.setColor(self.co)
brush.setStyle(self.str)
painter=QPainter(self)
painter.setPen(pen)
painter.setBrush(brush)
#设置是否抗锯齿
painter.setRenderHint(QPainter.Antialiasing,self.antialias)
#create QPinterPath()
path=QPainterPath()
path.moveTo(15,45)
# path.lineTo(45,10)
path.cubicTo(QPoint(15,0),QPoint(36,30),QPoint(45,10))
for x in range(int(self.width()/100)):
for y in range(int(self.height()/80)):
painter.save()
# 偏移
painter.translate(x * 100, y * 80)
#根据自己定义是否变换
if self.istransform:
painter.translate(30,30)
painter.rotate(90)
painter.scale(0.7,0.7)
painter.translate(-30,-30)
if self.shape==POINT:
painter.drawPoint(QPoint(20,20))
elif self.shape==LINE:
painter.drawLine(10,70,50,10)
elif self.shape==RECT:
painter.drawRect(10,10,40,50)
elif self.shape==ROUNDEDRECT:
painter.drawRoundedRect(10,10,40,50,20,20,mode=Qt.RelativeSize)
elif self.shape==ELLIPSE:
painter.drawEllipse(10,10,60,60)
elif self.shape==POLYLINE:
painter.drawPolyline(QPoint(10,10),QPoint(20,30),QPoint(40,30),QPoint(50,10))
elif self.shape==PIE:
painter.drawPie(QRect(10, 10, 50, 50), 30 * 16, 120 * 16)
elif self.shape==ARC:
painter.drawArc(QRect(10,10,50,50),30*16,120*16)
elif self.shape==CHORD:
painter.drawChord(QRect(10,10,50,50),30*16,120*16)
elif self.shape==PATH:
painter.drawPath(path)
elif self.shape==TEXT:
painter.drawText(25,25,'蝈蝈\n学习Qt')
elif self.shape==PIXMAP:
painter.drawPixmap(0,0,60,60,QPixmap('1.jpg'))
elif self.shape==POLYGON:
print('该功能未完成')
# QMessageBox().warning(self,'提醒','该功能未完成')
painter.restore()
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=PaintWidget()
win.show()
sys.exit(app.exec_())
配置文件style.py
POINT = 0
LINE = 1
RECT = 2
ROUNDEDRECT = 3
ELLIPSE = 6
POLYLINE = 7
POLYGON = 8
ARC = 9
PIE = 4
CHORD = 10
PATH = 5
TEXT = 11
PIXMAP = 12
paintPane.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'paintPane.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(940, 650)
self.horizontalLayoutWidget = QtWidgets.QWidget(Form)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 10, 661, 61))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
font = QtGui.QFont()
font.setFamily("AcadEref")
font.setPointSize(14)
self.label.setFont(font)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.shape_combox = QtWidgets.QComboBox(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.shape_combox.sizePolicy().hasHeightForWidth())
self.shape_combox.setSizePolicy(sizePolicy)
self.shape_combox.setMinimumSize(QtCore.QSize(50, 30))
self.shape_combox.setObjectName("shape_combox")
self.horizontalLayout.addWidget(self.shape_combox)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem2)
self.paint_window = PaintWidget(Form)
self.paint_window.setGeometry(QtCore.QRect(10, 100, 891, 391))
self.paint_window.setObjectName("paint_window")
self.groupBox_3 = QtWidgets.QGroupBox(Form)
self.groupBox_3.setGeometry(QtCore.QRect(690, 500, 191, 143))
self.groupBox_3.setObjectName("groupBox_3")
self.checkBox = QtWidgets.QCheckBox(self.groupBox_3)
self.checkBox.setGeometry(QtCore.QRect(20, 30, 161, 41))
self.checkBox.setObjectName("checkBox")
self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox_3)
self.checkBox_2.setGeometry(QtCore.QRect(20, 90, 71, 16))
self.checkBox_2.setObjectName("checkBox_2")
self.groupBox = QtWidgets.QGroupBox(Form)
self.groupBox.setGeometry(QtCore.QRect(10, 510, 361, 131))
self.groupBox.setObjectName("groupBox")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout.setObjectName("gridLayout")
self.label_2 = QtWidgets.QLabel(self.groupBox)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
self.width_spinbox = QtWidgets.QSpinBox(self.groupBox)
self.width_spinbox.setMinimum(1)
self.width_spinbox.setMaximum(10)
self.width_spinbox.setObjectName("width_spinbox")
self.gridLayout.addWidget(self.width_spinbox, 0, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(self.groupBox)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 0, 2, 1, 1)
self.jon_combox = QtWidgets.QComboBox(self.groupBox)
self.jon_combox.setObjectName("jon_combox")
self.gridLayout.addWidget(self.jon_combox, 0, 3, 1, 1)
self.label_3 = QtWidgets.QLabel(self.groupBox)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.color_btn = QtWidgets.QPushButton(self.groupBox)
self.color_btn.setText("")
self.color_btn.setObjectName("color_btn")
self.gridLayout.addWidget(self.color_btn, 1, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.groupBox)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 1, 2, 1, 1)
self.end_combox = QtWidgets.QComboBox(self.groupBox)
self.end_combox.setObjectName("end_combox")
self.gridLayout.addWidget(self.end_combox, 1, 3, 1, 1)
self.label_4 = QtWidgets.QLabel(self.groupBox)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1)
self.style_combox = QtWidgets.QComboBox(self.groupBox)
self.style_combox.setObjectName("style_combox")
self.gridLayout.addWidget(self.style_combox, 2, 1, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(Form)
self.groupBox_2.setGeometry(QtCore.QRect(390, 510, 241, 131))
self.groupBox_2.setObjectName("groupBox_2")
self.label_7 = QtWidgets.QLabel(self.groupBox_2)
self.label_7.setGeometry(QtCore.QRect(20, 30, 54, 21))
self.label_7.setObjectName("label_7")
self.label_8 = QtWidgets.QLabel(self.groupBox_2)
self.label_8.setGeometry(QtCore.QRect(20, 70, 54, 31))
self.label_8.setObjectName("label_8")
self.brush_color_btn = QtWidgets.QPushButton(self.groupBox_2)
self.brush_color_btn.setGeometry(QtCore.QRect(80, 22, 151, 31))
self.brush_color_btn.setText("")
self.brush_color_btn.setObjectName("brush_color_btn")
self.brush_style_combox = QtWidgets.QComboBox(self.groupBox_2)
self.brush_style_combox.setGeometry(QtCore.QRect(80, 70, 151, 31))
self.brush_style_combox.setObjectName("brush_style_combox")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "图形形状"))
self.groupBox_3.setTitle(_translate("Form", "高级选项"))
self.checkBox.setText(_translate("Form", "变换(缩放,平移)"))
self.checkBox_2.setText(_translate("Form", "抗锯齿"))
self.groupBox.setTitle(_translate("Form", "画笔"))
self.label_2.setText(_translate("Form", "宽度"))
self.label_5.setText(_translate("Form", "连接样式"))
self.label_3.setText(_translate("Form", "颜色"))
self.label_6.setText(_translate("Form", "末端笔帽样式"))
self.label_4.setText(_translate("Form", "样式"))
self.groupBox_2.setTitle(_translate("Form", "画刷"))
self.label_7.setText(_translate("Form", "颜色"))
self.label_8.setText(_translate("Form", "样式"))
from paintwindow import PaintWidget