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    [email protected]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

_______________________________________________
PyKDE mailing list    [email protected]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to