[PyKDE] calling a paintEvent in a custom control due to a mouse
event
Bernhard VonZastrow
bvz at c381.com
Wed Sep 27 23:39:34 BST 2006
Doh! I can't believe I am so dumb sometimes. After nearly two days
banging my head on this I found the QWidget.repaint event.
Oh well, learned a lot of other stuff in the struggle. :)
b
On Sep 27, 2006, at 3:27 PM, Bernhard VonZastrow wrote:
> Hello all, I am very new to PyQt so hopefully this isn't a
> completely boneheaded question...
>
> I am writing my own disclosureTriangle widget using PyQt4. I
> subclassed the QWidget object and implemented my own paintEvent
> function. In this function I am drawing the control using an
> instance of a QPainter object. (I got the basics for how to do
> this from a website who's url I can no longer find).
>
> The code to draw this control is as follows:
>
> #----------------------------------------------
> def paintEvent(self, event):
>
> if not self.isVisible():
> return
>
> if self.isEnabled():
> color = self.normalColor
> else:
> color = self.disabledColor
>
> if self.mouseDown == True:
> color = self.blackColor
>
> rightPolygon = QPolygon(3)
> rightPolygon.setPoint(0,1,1)
> rightPolygon.setPoint(1, 9, 6)
> rightPolygon.setPoint(2, 1, 11)
>
> downPolygon = QPolygon(3)
> downPolygon.setPoint(0,1,2)
> downPolygon.setPoint(1, 11,)
> downPolygon.setPoint(2, 6, 10)
>
> if self.state == "expanded":
> self.drawImage(color, downPolygon)
> else:
> self.drawImage(color, rightPolygon)
>
> #----------------------------------------------
> def drawImage(self, color, polygon):
> painter = QPainter()
> painter.begin(self)
> painter.setRenderHint(QPainter.Antialiasing, True)
> painter.setBrush(color)
> painter.setPen(color)
> painter.drawPolygon(polygon, Qt.OddEvenFill)
> painter.end()
>
>
> This all works as expected. The question is how do I tell the
> paintEvent to fire from within my code? I am implementing my own
> mousePressEvent code. When the user has pressed the mouse, I want
> to darken the image. How do I tell my widget (from within itself)
> that it needs to repaint itself?
>
> I've tried the following:
>
> #----------------------------------------------
> def mousePressEvent(self, event):
> if event.button() == Qt.LeftButton:
> self.mouseDown = True
> print "asdf"
> newRect = QRect(0,0,100,100)
> newEvent = QPaintEvent(newRect)
> self.paintEvent(newEvent)
>
>
> but I get the following output:
>
> asdf
> QPainter::begin: Widget painting can only begin as a result of a
> paintEvent
> Painter must be active to set rendering hints
> QPainter::end: Painter is not active, aborted
>
>
> Any ideas how to go about implementing this? Any help at all, even
> a push in the right direction would be appreciated.
>
> Thanks
> Ben
>
> _______________________________________________
> PyKDE mailing list PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
More information about the PyQt
mailing list