PyQt5 编写画布小程序

实现的效果图如下:

 该实例中,涉及到的知识点有:

1.PyQt5 的常用的布局方式,这里使用到了QVBoxLayout,QHBoxLayout,如何灵活运用这些布局;

2.常用组件的使用方法,这里使用到了QPushButton, QLabel, QPixmap;

3.使用QPainter进行绘制;

4.事件与槽;

主要代码如下:

import random
import sys

from PyQt5.QtCore import QSize
from PyQt5.QtGui import QPixmap, QPainter, QColor
from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication, QPushButton, QWidget, QVBoxLayout, QHBoxLayout

SPRAY_PARTICLES = 100
SPRAY_DIAMMETER = 10

COLORS = [
    '#000000', '#141923', '#414168', '#3a7fa7', '#35e3e3', '#8fd970', '#5ebb49',
    '#458352', '#dcd37b', '#fffee5', '#ffd035', '#cc9245', '#a15c3e', '#a42f3b',
    '#f45b7a', '#c24998', '#81588d', '#bcb0c2', '#ffffff',
]


class QPlatteButton(QPushButton):
    def __init__(self, color):
        super().__init__()

        self.setFixedSize(QSize(24, 24))
        self.color = color
        self.setStyleSheet("background-color: %s" % self.color)


class Canvas(QLabel):
    def __init__(self):
        super().__init__()

        canvas = QPixmap(1200, 800)
        canvas.fill(QColor('white'))
        self.setPixmap(canvas)

        self.last_x, self.last_y = None, None
        self.pen_color = QColor('#000')

    def set_pen_color(self, c):
        self.pen_color = QColor(c)

    def mouseReleaseEvent(self, *args, **kwargs):
        """
        松开鼠标事件
        """
        self.last_x, self.last_y = None, None

    def mouseMoveEvent(self, e):
        """
        移动鼠标事件
        """
        if self.last_x is None:
            self.last_x = e.x()
            self.last_y = e.y()
            return

        painter = QPainter(self.pixmap())
        pen = painter.pen()
        pen.setWidth(4)
        pen.setColor(self.pen_color)
        painter.setPen(pen)
        painter.drawLine(self.last_x, self.last_y, e.x(), e.y())
        painter.end()
        self.update()

        # update the origin for next time
        self.last_x = e.x()
        self.last_y = e.y()

    # def mouseMoveEvent(self, e):
    #     painter = QPainter(self.pixmap())
    #     p = painter.pen()
    #     p.setWidth(1)
    #     p.setColor(self.pen_color)
    #     painter.setPen(p)
    #
    #     for n in range(SPRAY_PARTICLES):
    #         xo = random.gauss(0, SPRAY_DIAMMETER)
    #         yo = random.gauss(0, SPRAY_DIAMMETER)
    #         painter.drawPoint(e.x() + xo, e.y() + yo)
    #
    #     self.update()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("画板小程序")

        self.canvas = Canvas()

        widget = QWidget()
        vlayout = QVBoxLayout()
        widget.setLayout(vlayout)

        vlayout.addWidget(self.canvas)

        palette = QHBoxLayout()
        vlayout.addLayout(palette)
        self.add_palette_buttons(palette)
        self.setCentralWidget(widget)

    def add_palette_buttons(self, layout):
        """
        在水平布局中放入一行调色板
        """
        for c in COLORS:
            b = QPlatteButton(c)
            b.pressed.connect(lambda c=c: self.canvas.set_pen_color(c))
            layout.addWidget(b)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.move(120, 120)
    window.show()
    app.exec_()

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值