pyqt5で簡単な描画ボードを作成する

序文

前回のブログでは

Pyqt5とopencvで写真の背景色を変える_治りにくい狂気のブログ - CSDNブログ

ボードを描画するために使用されますが、ブラシが設定されていません。これを踏まえてブラシを操作していきます。より良い描画

文章

まずは実行後の動作を見てみましょう

操作する

 まず画像を開く必要があります

たとえば、これ

取得したら、全画面表示でメインページから飛び出てください

 より簡単に

ボタンは 2 つあり、1 つはペンで、ペンを設定するために使用されます。

もう一つは節約することです

ペン

ペンをクリックします

 上に示すように、メイン ページにダイアログ ボックスが表示されます。

この時点でペン、ペンの色、ペンの線種などを選択できます。

選択後、「OK」ボタンをクリックする必要があります。「キャンセル」をクリックするとダイアログボックスが閉じられ、何も起こりません。

絵に絵が描けない

「OK」をクリックすると、--- ペンが表示されます。

ボタン ペンをもう一度クリックすると、最後の選択範囲が表示されます。これはキャッシュに相当します。

メインページを閉じない限り、キャッシュが残ります。

ソースコード

メインのソースコード

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