为了账号安全,请及时绑定邮箱和手机立即绑定

在PyQt5窗口的下部绘制

在PyQt5窗口的下部绘制

www说 2023-09-05 15:27:05
我正在尝试制作一个程序,仅在屏幕的半个按钮上绘制,但是正如您所看到的,绘画向底部移动,如果我在上部绘制,则绘画发生在下部。我想要的是直接在底部绘制。这是我的代码:from PIL.ImageEnhance import Colorfrom PyQt5.QtWidgets import QMainWindow, QApplication, QMenu, QMenuBar, QAction, QFileDialog, QTextEdit, QVBoxLayout, \    QWidget, QLabelfrom PyQt5.QtGui import QIcon, QImage, QPainter, QPen, QBrush, QPixmapfrom PyQt5.QtCore import Qt, QPoint, QSize, QRectimport sysimport pyautoguiclass Window(QMainWindow):    def __init__(self):        super().__init__()        title = "Digital Waraq"        icon = "icons/pain.png"        [x, y] = pyautogui.size()        self.setWindowTitle(title)        self.setGeometry(0, 0, x, y)        self.setWindowIcon(QIcon(icon))        self.image = QImage(pyautogui.size().width, int(pyautogui.size().height/2), QImage.Format_RGB32)        self.image.fill(Qt.gray)        self.drawing = False        self.brushSize = 2        self.brushColor = Qt.black        self.lastPoint = QPoint()    def mousePressEvent(self, event):        if event.button() == Qt.LeftButton:            self.drawing = True            self.lastPoint = event.pos()            #print(self.lastPoint)    def mouseMoveEvent(self, event):        if(event.buttons() & Qt.LeftButton) & self.drawing:            painter = QPainter(self.image)            painter.setPen(QPen(self.brushColor, self.brushSize, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))            painter.drawLine(self.lastPoint, event.pos())            self.lastPoint = event.pos()            self.update()    def mouseReleaseEvent(self, event):        if event.button() == Qt.LeftButton:            self.drawing = False    def paintEvent(self, event):        canvasPainter  = QPainter(self)        #canvasPainter.drawImage(self.rect(), self.image, self.image.rect())        newRect = QRect(QPoint(0, int(pyautogui.size().height/2)), QSize(self.image.size()))        #canvasPainter.drawImage(newRect, self.image, self.image.rect())        canvasPainter.drawImage(newRect, self.image, self.image.rect())
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

不要使在小部件内划分绘画区域的任务复杂化,更简单的解决方案是创建一个完全完成绘画的小部件,然后将其放置在主窗口的底部。


import sys


from PyQt5.QtCore import QPoint, Qt

from PyQt5.QtGui import QBrush, QGuiApplication, QImage, QPainter, QPen

from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget



class Drawer(QWidget):

    def __init__(self, parent=None):

        super().__init__(parent)


        self._drawing = False

        self.last_point = QPoint()


        self._image_layer = QImage(self.size(), QImage.Format_RGB32)

        self._image_layer.fill(Qt.gray)


        self.brushSize = 2

        self.brushColor = Qt.black


    def mousePressEvent(self, event):

        self._drawing = True

        self.last_point = event.pos()


    def mouseMoveEvent(self, event):

        if self._drawing and event.buttons() & Qt.LeftButton:

            painter = QPainter(self._image_layer)

            painter.setPen(

                QPen(

                    self.brushColor,

                    self.brushSize,

                    Qt.SolidLine,

                    Qt.RoundCap,

                    Qt.RoundJoin,

                )

            )

            painter.drawLine(self.last_point, event.pos())

            self.last_point = event.pos()

            self.update()


    def mouseReleaseEvent(self, event):

        self._drawing = True


    def paintEvent(self, event):

        painter = QPainter(self)

        painter.drawImage(QPoint(), self._image_layer)

        painter.end()

        


    def resizeEvent(self, event):

        if (

            self.size().width() > self._image_layer.width()

            or self.size().height() > self._image_layer.height()

        ):

            qimg = QImage(

                max(self.size().width(), self._image_layer.width()),

                max(self.size().height(), self._image_layer.height()),

                QImage.Format_RGB32,

            )

            qimg.fill(Qt.gray)

            painter = QPainter(qimg)

            painter.drawImage(QPoint(), self._image_layer)

            painter.end()

            self._image_layer = qimg

            self.update()



class Window(QMainWindow):

    def __init__(self, parent=None):

        super().__init__(parent)


        self.drawer = Drawer()


        central_widget = QWidget()

        self.setCentralWidget(central_widget)


        vlay = QVBoxLayout(central_widget)

        vlay.setContentsMargins(0, 0, 0, 0)

        vlay.addStretch(1)

        vlay.addWidget(self.drawer, stretch=1)


        r = QGuiApplication.primaryScreen().availableGeometry()

        self.setGeometry(r)



if __name__ == "__main__":

    app = QApplication(sys.argv)

    window = Window()

    window.show()

    sys.exit(app.exec())



查看完整回答
反对 回复 2023-09-05
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信