2017-12-28 29 views
0

次のコードでは、「ペイント」ボタンをクリックすると1つの長方形が作成されます。 「移動」ボタンも含まれています。 "移動"ボタンをクリックすることで、xとyの両方向に1pxの矩形を移動したいと思います。しかし、私はここで失敗しました。PyQt5:ボタンをクリックしてペイントを移動するにはどうすればいいですか?

私は、ボタンをクリックすると変数値を転送する方法についてご理解いただけます。初心者には私にとってはとても難しいです。どんな助けも高く評価されます!

# -*- 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

self.flag_moveが最初に定義されていないためコードにエラーがありますが、多くの変数を使用する必要はありません。

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

こんにちは、@eyllanesc、私はあなたにさらなる質問をするべきですか?これまでの四角形を移動すると、「移動」ボタンが押されるまで四角形がボタンの後ろに表示されます。長方形を常にボタンの上に置く方法はありますか? –

+1

いいえ、あなたはウィジェットをペイントしています。ボタンはウィジェットの上にあります。 – eyllanesc

関連する問題