简体   繁体   English

在 PyQt5 窗口的下部绘制

[英]draw on the lower part of the window PyQt5

I am trying to make a program the paints on the half button of the screen only, but as you can see the painting is shifted towards the bottom, if I draw in the upper part, the paint happens in the lower part.我正在尝试制作一个程序,只在屏幕的半按钮上绘制,但是正如您所看到的,绘画向底部移动,如果我在上部绘制,则绘制发生在下部。 What I want is to draw directly in the bottom part.我想要的是直接在底部绘制。

在此处输入图片说明

here is my code:这是我的代码:

from PIL.ImageEnhance import Color
from PyQt5.QtWidgets import QMainWindow, QApplication, QMenu, QMenuBar, QAction, QFileDialog, QTextEdit, QVBoxLayout, \
    QWidget, QLabel
from PyQt5.QtGui import QIcon, QImage, QPainter, QPen, QBrush, QPixmap
from PyQt5.QtCore import Qt, QPoint, QSize, QRect
import sys

import pyautogui



class 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())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec())

Do not complicate the task dividing the painting area within the widget, a simpler solution is to create a widget where the painting is done completely and then place it at the bottom of the main window.不要将在widget内划分绘画区域的任务复杂化,更简单的解决方案是创建一个绘画完成的widget,然后将其放置在主窗口的底部。

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())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM