FarouK
FarouK

Reputation: 880

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.

enter image description here

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

Upvotes: 0

Views: 488

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

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.

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

Upvotes: 1

Related Questions