Preface
In the previous 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", "取消"))