亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號