Create a simple drawing board with pyqt5

Preface

In the previous blog

Pyqt5 and opencv change the background color of photos_The blog of the madness that is hard to get rid of-CSDN blog

Used to draw the board, but the brush settings are not set. So based on this, operate the brush. better drawing

text

Let’s first look at the operation after running

operate

 First you need to open a picture

For example, this

After getting it, jump out of the main page in full screen

 easier

There are two buttons, one is the pen, used to set the pen

Another is to save

Pen

Click the pen

 A dialog box will pop up on the main page, as shown above.

At this point you can select the pen, pen color, pen line type, etc.

After selecting, you need to click the OK button. If you click Cancel, it means closing the dialog box and nothing else will happen.

Can't draw on the picture

Click OK and you will get --- pen

Click the button pen again and you will get the last selection, which is equivalent to caching.

As long as you don't close the main page, there will be cache.

Source code

Main source code

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from 草稿本.demo_pen import Ui_Form
import os
class Board(QWidget):
    def __init__(self,picture,spin,color=Qt.black):
        super().__init__()
        self.pen = None
        self.paint =QPainter(self)
        self.spin=spin
        self.color=color
        self.picture=picture
    def paintEvent(self, e):
        if self.picture:
            self.paint.begin(self)
            self.paint.drawPixmap(0,0,self.picture)
            self.paint.end()
    def get_picture(self,picture):
        self.clear()
        self.picture=picture
    def get_pen(self,pen):
        self.pen=pen
    def clear(self):
        self.picture.fill(Qt.white)
    def mouseMoveEvent(self, e):
        if self.picture:
            if self.pen:
                self.paint.begin(self.picture)
                self.paint.setPen(self.pen)
                self.paint.drawPoint(e.pos())
                self.paint.end()
                self.update()
    def change_spin(self,spin):
        self.spin=spin
    def get_color(self,color):
        self.color=color
    def save(self):
        image = self.picture.toImage()
        return image
class Pen(QDialog,Ui_Form):
    def __init__(self,pen_style=1,sp_value=0,qss=None):
        super().__init__()
        self.qss = qss
        self.sb_value = sp_value
        self.pen_style = pen_style
        self.setupUi(self)
        self.__pen=QPen()
        self.initui()
    def initui(self):
        self.comboBox.addItems(['Nopen','SolidLine','DashLine','DotLine','DashDotLine','DashDotDotLine','CustomDashLine'])
        self.comboBox.currentIndexChanged.connect(self.change_index)
        self.setpen()
    def change_index(self):
        self.pen_style=self.comboBox.currentIndex()
    def setpen(self):
        self.comboBox.setCurrentIndex(self.pen_style)
        self.spinBox.setValue(self.sb_value)
        self.btncolor.setStyleSheet(self.qss)
    def getpen(self):
        index=self.comboBox.currentIndex()
        self.__pen.setStyle(Qt.PenStyle(index))
        self.__pen.setWidth(self.spinBox.value())
        color=self.btncolor.palette().color(QPalette.Button)
        self.__pen.setColor(color)
        return self.__pen
    def get_init_data(self):
        return [self.pen_style,self.sb_value,self.qss]
    @pyqtSlot(int)
    def on_spinBox_valueChanged(self,value):
        self.sb_value=value
    @pyqtSlot()
    def on_btncolor_clicked(self):
        color=QColorDialog.getColor()
        if color.isValid():
            qss = f"background-color:rgb({color.red()},{color.green()},{color.blue()});"
            self.qss=qss
            self.btncolor.setStyleSheet(qss)
    @pyqtSlot()
    def on_loser_clicked(self):
        self.close()
    @pyqtSlot()
    def on_ok_clicked(self):
        self.accept()
class Main(QWidget):
    def __init__(self,picture):
        super().__init__()
        self.pen_init = None
        self.v2 = None
        self.pen = None
        self.nums = None
        self.iters = None
        self.picture = None
        self.cv_img = None
        self.color = None
        self.color_change = None
        self.board = None
        self.size = None
        self.spin = None
        self.pen_window=None
        self.paint = None
        self.img = None
        self.filename = picture
        self.initui()
    def initui(self):
        self.setWindowTitle('核心')
        self.pen_init=[1,0,None]
        self.set_layout()
    def set_layout(self):
        h=QHBoxLayout(self)
        v1= QHBoxLayout(self)
        self.v2=QVBoxLayout(self)
        v1.addWidget(self.get_paint())
        widgets=self.get_widget()
        for i in widgets:
            self.v2.addWidget(i)
        h.addLayout(v1)
        h.addLayout(self.v2)
        return h
    def get_widget(self):
        pen=QPushButton('笔',self)
        pen.clicked.connect(self.pen_click)
        save=QPushButton('保存',self)
        save.clicked.connect(self.save_picture)
        return pen,save
    def pen_click(self):
        self.pen=Pen(pen_style=self.pen_init[0],sp_value=self.pen_init[1],qss=self.pen_init[2])
        self.v2.addWidget(self.pen)
        ret=self.pen.exec()
        if ret==QDialog.Accepted:
            self.pen_init=self.pen.get_init_data()
            self.board.get_pen(self.pen.getpen())
    def save_picture(self):
        path,ok = QFileDialog.getSaveFileName(self, '保存图片', '.\\', '(*.jpg *.png)')
        if ok:
            img=self.board.save()
            img.save(path)
    def get_paint(self):
        image=QPixmap(self.filename)
        self.board=Board(image,self.size)
        return self.board
class Start(QWidget):
    def __init__(self):
        super().__init__()
        self.filename=None
        self.main=None
        self.initui()
    def initui(self):
        self.resize(640,480)
        self.setWindowTitle('主页面')
        self.set_layout()
    def set_layout(self):
        v1=QHBoxLayout(self)
        open_btn=self.get_btn()
        v1.addWidget(open_btn)
        return v1
    def get_btn(self):
        btn1=QPushButton('打开图片',self)
        btn1.clicked.connect(self.open)
        return btn1
    def open(self):
        filename, ok = QFileDialog.getOpenFileName(self, '打开文件', os.getcwd(), '(*.jpg *.png)')
        if ok:
            self.filename=filename
            self.main=Main(self.filename)
            self.main.setWindowModality(Qt.ApplicationModal)
            self.main.showMaximized()
    def paintEvent(self, a0):
        paint = QPainter(self)
        pixmap = QPixmap('C:/Users/520/PycharmProjects/pythonProject4/图片/图片/29.jpg')
        paint.drawPixmap(self.rect(), pixmap)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    a = Start()
    a.show()
    app.exec_()

secondary source code

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pen.ui'
#
# Created by: PyQt5 UI code generator 5.15.8
#
# 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(400, 300)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(60, 30, 111, 31))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(30, 90, 61, 20))
        self.label_2.setObjectName("label_2")
        self.comboBox = QtWidgets.QComboBox(Form)
        self.comboBox.setGeometry(QtCore.QRect(80, 90, 141, 22))
        self.comboBox.setCurrentText("")
        self.comboBox.setObjectName("comboBox")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(20, 150, 72, 15))
        self.label_3.setObjectName("label_3")
        self.spinBox = QtWidgets.QSpinBox(Form)
        self.spinBox.setGeometry(QtCore.QRect(81, 150, 81, 22))
        self.spinBox.setObjectName("spinBox")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(10, 210, 72, 15))
        self.label_4.setObjectName("label_4")
        self.btncolor = QtWidgets.QPushButton(Form)
        self.btncolor.setGeometry(QtCore.QRect(80, 200, 93, 28))
        self.btncolor.setText("")
        self.btncolor.setObjectName("btncolor")
        self.ok = QtWidgets.QPushButton(Form)
        self.ok.setGeometry(QtCore.QRect(260, 70, 93, 28))
        self.ok.setObjectName("ok")
        self.loser = QtWidgets.QPushButton(Form)
        self.loser.setGeometry(QtCore.QRect(260, 160, 93, 28))
        self.loser.setObjectName("loser")

        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", "pen设置属性"))
        self.label_2.setText(_translate("Form", "线型"))
        self.label_3.setText(_translate("Form", "线宽"))
        self.label_4.setText(_translate("Form", "颜色"))
        self.ok.setText(_translate("Form", "确定"))
        self.loser.setText(_translate("Form", "取消"))

Guess you like

Origin blog.csdn.net/qq_63401240/article/details/129769027