2017-12-28 54 views
0

다음 코드에서 "그림판"단추를 클릭하면 사각형 하나가 만들어집니다. 그것은 또한 "이동"버튼을 포함하고 있습니다. "이동"버튼을 클릭하여 사각형 1px를 x 및 y 방향으로 모두 이동하려고합니다. 하지만 여기서 실패했습니다.PyQt5 : 버튼을 클릭하여 페인트를 이동하는 방법?

버튼을 클릭하면 변수 값을 전송하는 방법에 대한 질문을 이해할 수 있습니다. 초심자에게는 저에게는 매우 어렵습니다. 어떤 도움을 주시면 감사하겠습니다! self.flag_move가 처음에 정의되어 있지 않기 때문에

# -*- 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_()) 

답변

1

코드는 오류를 가지고 있지만이 중 많은 변수를 사용할 필요가 없습니다.

Qt는 작업을 더 쉽게 해주는 몇 가지 메소드가 있으며 처음에는 null QRect를 만들고, btnPaint 버튼을 누르면 QRect를 null이 아닌 값으로 설정할 수 있습니다. 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) 
+0

여러분의 도움에 감사드립니다! 정말 고맙습니다! –

+0

안녕하세요, @yllanesc, 제가 추가 질문을해야합니까? "이동"버튼을 누르기 전까지 사각형을 이동하면 단추 뒤에 사각형이 표시됩니다. 단추 위에 항상 사각형을 놓을 수있는 방법이 있습니까? –

+1

아니요, 당신은 위젯을 그리는 중이며, 버튼은 위젯 위에 있습니다. – eyllanesc