pyqt 小项目

此项目是别人用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)

用设计师设计界面

保存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,后面的图形代码都在这里完成。

这里传参要注意,之前看的是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)
       

第一阶段成果

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_())






证据抗锯齿,是否变换

     #根据自己定义是否变换
                if self.istransform:
                    painter.translate(30,30)
                    painter.rotate(90)
                    painter.translate(-30,-30)

完整代码如下: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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值