前言
在上篇博客中
pyqt5与opencv对照片换底色_疏狂难除的博客-CSDN博客
用来画板,但没有对画笔进行设置。所以在此基础上,对画笔进行操作。更好的画画
正文
先看一下运行之后的操作
操作
先要打开一张图片
比如,这张
得到之后,全屏跳出主页面
扫描二维码关注公众号,回复:
16701468 查看本文章
![](/qrcode.jpg)
比较简单
有两个按钮,一个是笔,用来设置笔的
另一个是保存
笔
点击一下笔
就会在主页面中跳出一个对话框,如上图
此时就可以对笔进行选择,笔的颜色,笔的线型等。
选择之后,需要点击确定按钮,如果点击的是取消,就代表把对话框关闭,其他没反应。
无法在图上画画
点击确定,就可以得到---笔
再次点击按钮笔,得到的还是上一次的所选择的,相当于缓存了
只要你不把主页面关闭,就会有缓存。
源码
主要源码
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", "取消"))