用PyQt5做画矩形的GUI程序

首先,导入PyQt5模块:

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

应用名:

__appname__ = 'painter'

声明矩形类,方便画的时候把握好其属性:

class Rect:
    
    def __init__(self):
        self.start = QPoint()
        self.end = QPoint()
    
    def setStart(self, s):
        self.start = s

    def setEnd(self, e):
        self.end = e

    def startPoint(self):
        return self.start

    def endPoint(self):
        return self.end

    def paint(self, painter):
        painter.drawRect(self.startPoint().x(), self.startPoint().y(), self.endPoint().x() - self.startPoint().x(), self.endPoint().y() - self.startPoint().y())

定义主界面:

class PaintCanvas(QWidget):
    
    def __init__(self, *args, **kwargs):
        super(PaintCanvas, self).__init__(*args, **kwargs)#继承父类
        self.setMouseTracking(True)#保证得到鼠标信息
        self.drawingRectColor = QColor(0, 255, 0)
        self.rectList = []#矩形对象列表
        self.perm = False#描述在不在画
        self.shape = None#储存画的矩形对象
        self.painter = QPainter(self)

定义鼠标动作触发的事件内容:

def mouseMoveEvent(self, ev):
        pos = ev.pos()#得到鼠标位置
        window = self.parent().window()#得到窗口对象
        if window is not None:
            self.parent().window().labelCoordinates.setText('X: %d; Y: %d' %(pos.x(), pos.y()))#设置窗口状态栏信息
        if ev.buttons() & Qt.LeftButton:
            if self.shape is not None and not self.perm:
                self.shape.setEnd(ev.pos())
                self.update()

def mousePressEvent(self, ev):
        if ev.button() == Qt.LeftButton:
            self.shape = Rect()
            if(self.shape is not None):
                self.perm = False
                self.rectList.append(self.shape)
                self.shape.setStart(ev.pos())
                self.shape.setEnd(ev.pos())
            self.update()

def mouseReleaseEvent(self, ev):
        if ev.button() == Qt.LeftButton:
            self.perm = True
            self.shape = None
            self.update()

重写窗口paintEvent()函数:

def paintEvent(self, ev):
        p = self.painter
        p.begin(self)
        p.setPen(self.drawingRectColor)
        brush = QBrush(Qt.BDiagPattern)
        p.setBrush(brush)
        for shape in self.rectList:
            shape.paint(p)
        p.end()

构建MainWindow类:

class MainWindow(QMainWindow):
    
    def __init__(self):
        super(MainWindow, self).__init__()
        self.resize(800, 600)
        self.setWindowTitle(__appname__)
        self.paintCanvas = PaintCanvas(parent=self)
        self.scroll = QScrollArea()
        self.scroll.setWidget(self.paintCanvas)
        self.scroll.setWidgetResizable(True)
        self.setCentralWidget(self.scroll)
        self.statusBar().showMessage('%s started.' % __appname__)
        self.statusBar().show()
        self.labelCoordinates = QLabel('')
        self.statusBar().addPermanentWidget(self.labelCoordinates)

主函数部分:

def get_main_app(argv=[]):
    app = QApplication(argv)
    app.setApplicationName(__appname__)
    win = MainWindow()
    win.show()
    return app, win

app, _win = get_main_app(sys.argv)
sys.exit(app.exec_())

最后程序结果如图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值