1

私はPythonを初めて使用し、Guiの開発にPyQt4を使用しています。トグルボタンを押しながら円の色を変えたい。しかし、スロットでエラーが発生しています。

私のコードは次のとおりです。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyFrame(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self)

        self.scene=QGraphicsScene(self)
        self.scene.setSceneRect(QRectF(0,0,245,245))
        self.bt=QPushButton("Press",self)
        self.bt.setGeometry(QRect(450, 150, 90, 30))
        self.bt.setCheckable(True)
        self.color = QColor(Qt.green)
        self.color1= QColor(Qt.magenta)
        self.show()
        self.connect(self.bt, SIGNAL("clicked()"), self.changecolor)

    def paintEvent(self, event=None):
        paint=QPainter(self)
        paint.setPen(QPen(QColor(Qt.magenta),1,Qt.SolidLine))
        paint.setBrush(self.color)
        paint.drawEllipse(190,190, 70, 70)
        paint.setPen(QPen(QColor(Qt.green),1,Qt.SolidLine))
        paint.setBrush(self.color1)
        paint.drawEllipse(300,300, 70, 70)

    def changecolor(self):
        if pressed:
         self.color = QColor(Qt.red)
         self.color1= QColor(Qt.blue)
        else:
         self.color=QColor(Qt.yellow)
         self.color1=QColor(Qt.gray)

        self.update()

app=QApplication(sys.argv)
f=MyFrame()
f.show()
app.exec_()
4

1 に答える 1

3

現状では、selfという1つの引数だけでchangecolorを呼び出そうとします。あなたが何を達成しようとしているのか完全にはわかりません。changecolorは変数「paint」を取りますが、存在しないself.paintを使用しようとします。したがって、次のように、QPainterを呼び出すだけでペインターを手に入れ、「paint」というパラメータを失うことができると考えるかもしれません。

def changecolor(self):
  paint = QPainter(self)
  paint.setBrush(QColor(Qt.red))
  paint.drawEllipse(190,190,70,70)
  self.update()

これにより、次のエラーが発生します。

QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setBrush: Painter not active

つまり、paintEvent内でのみペイントアクションを実行できるということです。1つの解決策は、円に必要な色を保持するself.colorなどのクラスメンバーを用意することです。完全に機能するコードは次のとおりです。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyFrame(QWidget):
  def __init__(self, parent=None):
    QWidget.__init__(self)

    self.scene=QGraphicsScene(self)
    self.scene.setSceneRect(QRectF(0,0,245,245))
    self.bt=QPushButton("Press",self)
    self.bt.setGeometry(QRect(450, 150, 90, 30))
    self.color = QColor(Qt.green)
    self.show()
    self.connect(self.bt, SIGNAL("clicked()"), self.changecolor)

  def paintEvent(self, event=None):
    paint=QPainter(self)
    paint.setPen(QPen(QColor(Qt.red),1,Qt.SolidLine))
    paint.setBrush(self.color)
    paint.drawEllipse(190,190, 70, 70)

  def changecolor(self):
    self.color = QColor(Qt.red)
    self.update()

app=QApplication(sys.argv)
f=MyFrame()
f.show()
app.exec_()
于 2012-09-07T11:08:57.090 に答える