【问题标题】:PyQt5: How to click a button to move the paint?PyQt5:如何单击按钮来移动油漆?
【发布时间】:2017-12-28 14:54:38
【问题描述】:

在下面的代码中,单击“Paint”按钮时会生成一个矩形。它还包含一个“移动”按钮。通过单击“移动”按钮,我想在 x 和 y 方向上移动矩形 1px。但我在这里失败了。

我可以理解问题是关于如何在单击按钮时传输变量值。对于初学者来说,这对我来说非常困难。任何帮助将不胜感激!

# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QHBoxLayout, QDoubleSpinBox
from PyQt5.QtGui import QPainter, QColor, QBrush
import sys

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
        self.flag = False

    def initUI(self):
        self.setFixedSize(400, 400)
        self.setWindowTitle('Colours')
        self.btnPaint = QPushButton("Paint", self)
        self.btnMove = QPushButton("Move x+1 y+1", self)

        self.deltax = 0  # original value
        self.deltay = 0  # original value

        self.btnPaint.clicked.connect(self.onPaint)
        self.btnMove.clicked.connect(self.onMove)


        self.hlayout = QHBoxLayout()
        self.hlayout.addWidget(self.btnPaint)
        self.hlayout.addWidget(self.btnMove)
        self.hlayout.addStretch(1)
        self.setLayout(self.hlayout)


        self.show()

    def onPaint(self):
        self.flag = True
        self.update()

    def onMove(self):
        self.deltax = self.deltax + 1  # button clicked, value +1
        self.deltay = self.deltay + 1  # button clicked, value +1
        self.flag_move = True
        self.update()

    def paintEvent(self, e):
        if self.flag:
            qp = QPainter()
            qp.begin(self)
            self.drawRectangles(qp)
            qp.end()
        if self.flag_move:

            qp = QPainter()
            qp.begin(self)
            self.drawRectangles(qp)
            qp.end()

    def drawRectangles(self, qp):
        x1 = 10
        y1 = 15
        x2 = 90
        y2 = 60

        col = QColor(0, 0, 0)
        col.setNamedColor('#d4d4d4')
        qp.setPen(col)
        qp.setBrush(QColor(200, 0, 0))
        qp.drawRect(x1+self.deltax, y1+self.deltay, x2+self.deltax, y2+self.deltay)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt qt5 pyqt5


    【解决方案1】:

    你的代码有错误,因为 self.flag_move 最初没有定义,但也没有必要使用这么多变量。

    Qt 有 QRect 类,它有几个方法使任务更容易,最初我们创建一个空 QRect,当按下 btnPaint 按钮时,我们将启用 QRect 到一个非空的。在按下 btnMove 按钮的情况下,我们将使用 translate 方法来移动矩形:

    import sys
    from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QHBoxLayout
    from PyQt5.QtGui import QPainter, QColor, QBrush
    from PyQt5.QtCore import QRect, QPoint
    
    class Example(QWidget):
        def __init__(self):
            super(Example, self).__init__()
            self.initUI()
    
        def initUI(self):
            self.setFixedSize(400, 400)
            self.setWindowTitle('Colours')
            self.btnPaint = QPushButton("Paint", self)
            self.btnMove = QPushButton("Move x+1 y+1", self)
            self.rect = QRect()
    
            self.btnPaint.clicked.connect(self.onPaint)
            self.btnMove.clicked.connect(self.onMove)
    
            self.hlayout = QHBoxLayout(self)
            self.hlayout.addWidget(self.btnPaint)
            self.hlayout.addWidget(self.btnMove)
            self.hlayout.addStretch(1)
            self.show()
    
        def onPaint(self):
            if self.rect.isNull():
                self.rect = QRect(10, 15, 80, 45)
                self.update()
    
        def onMove(self):
            if not self.rect.isNull():
                self.rect.translate(QPoint(1, 1))
                self.update()
    
        def paintEvent(self, e):
            qp = QPainter(self)
            qp.setPen(QColor("#d4d4d4"))
            qp.setBrush(QColor(200, 0, 0))
            qp.drawRect(self.rect)
    

    【讨论】:

    • 您的帮助真是太好了!非常感谢!
    • 嗨,@eyllanesc,我应该再问你一个问题吗?如果我移动矩形到目前为止,直到它点击“移动”按钮,矩形显示在按钮后面。有什么方法可以让矩形始终在按钮上方?
    • 不,您正在绘制小部件,并且按钮位于小部件顶部。
    • 感谢您的回复。这是合理的。我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2017-05-18
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多