pyqt5制作简单的画板

前言

在上篇博客中

pyqt5与opencv对照片换底色_疏狂难除的博客-CSDN博客

用来画板,但没有对画笔进行设置。所以在此基础上,对画笔进行操作。更好的画画

正文

先看一下运行之后的操作

操作

 先要打开一张图片

比如,这张

得到之后,全屏跳出主页面

扫描二维码关注公众号,回复: 16701468 查看本文章

 比较简单

有两个按钮,一个是笔,用来设置笔的

另一个是保存

点击一下笔

 就会在主页面中跳出一个对话框,如上图

此时就可以对笔进行选择,笔的颜色,笔的线型等。

选择之后,需要点击确定按钮,如果点击的是取消,就代表把对话框关闭,其他没反应。

无法在图上画画

点击确定,就可以得到---笔

再次点击按钮笔,得到的还是上一次的所选择的,相当于缓存了

只要你不把主页面关闭,就会有缓存。

源码

主要源码

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

次要源码

# -*- 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", "取消"))

猜你喜欢

转载自blog.csdn.net/qq_63401240/article/details/129769027