[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