Helo dear python-hackers, im quite new to python and pyqt and stumbled across a problem which seems unsolvable for me. I wrote a little test application using the canvas painting facility and wanted to rotate a canvasText. But i cant figure how to get it properly repainted after i moved the view or the whole window. The rotated Text always looks dirty or doesnt get repainted at all.
Here's the code: from qt import * from qtcanvas import * import sys ## let pyqt say which name an event has! ## borrowed this class from: ## http://mats.imk.fraunhofer.de/pipermail/pykde/2003-October/006212.html class _qtEvent: _qtEventDict = { 0: "None", 12: "Paint", 13: "Move", 14: "Resize", 15: "Create", 16: "Destroy", 17: "Show", 18: "Hide" } def types(self): return self._qtEventDict.keys() def which(self, t): try: if t in self._qtEventDict.keys(): return self._qtEventDict[t] except: return "Unknown"; qte = _qtEvent() #################################################### class TestCanvas(QCanvas): def __init__(self, parent, *args): QCanvas.__init__(self, *args) self.parent=parent self.setDoubleBuffering(0) #################################################### ## ROTATED TEXT CLASS class TestTextItem(QCanvasText): def __init__(self, text, x, y, degree, parent,*args): QCanvasText.__init__(self,parent,*args) self.degree=degree self.parent=parent self.text=QString(text) self.x=x self.y=y #font debug info print "Using font-family: ",self.font().family() qfm = QFontMetrics(self.font()) print "font specs: ",qfm.height(),qfm.width(self.text) #getting text-bounding-box from fontmetrics self._bndrect=QRect(0,0,qfm.width(self.text),qfm.height()) #do the rotation and translation wm = QWMatrix() wm.rotate(self.degree) wm.translate(self.x,self.y) self._bndrect=wm.mapRect(self._bndrect) print "Inital bounding: ",self._bndrect.left()\ ,self._bndrect.top(),self._bndrect.right(),self._bndrect.bottom() def boundingRect(self): return self._bndrect def draw(self, qp): qp.save() wm = QWMatrix() qp.setWorldMatrix(wm.rotate(self.degree)) qp.setWorldMatrix(wm.translate(self.x,self.y)) self.setText(self.text) QCanvasText.draw(self,qp) qp.restore() qp.drawRect(self._bndrect) #################################################### class TestCanvasView(QCanvasView): def __init__(self, *args): QCanvasView.__init__(self,*args) def paintEvent(selv,ev): QFrame.paintEvent(ev) p=QPainter(self) p.setClipRegion(ev.region()) for i in self.canvas().canvItems: canvItems.show() #just for tracing the event handling def eventFilter(self, qobj, qev): if qev.type()==QEvent.Paint: print "TestCanvasView(QCanvasView) Event:"\ ,qte.which(qev.type()) print "repaintRect(x1,y1,x2,y2) ="\ ,qev.rect().x(),qev.rect().y()\ ,qev.rect().x()+qev.rect().width(),qev.rect().y()+qev.rect().height() else: print "TestCanvasView(QCanvasView) Event: "\ ,qte.which(qev.type()) return QCanvasView.eventFilter(self,qobj,qev) #################################################### class TestClass(QMainWindow): def __init__(self) : self.canvItems=[] QMainWindow.__init__(self) self.canv=TestCanvas(self,640,480) self.canvView=TestCanvasView(self.canv,self) def show(self): QMainWindow.show(self) self.canvView.resize(self.width(),self.height()) self.setCentralWidget(self.canvView) for i in range(5): item=QCanvasRectangle(0,0,100+5*i,100+5*i,self.canv) item.show() self.canvItems.append(item) item=TestTextItem("Text "+str(i), 100+5*i,5*i, 12*i\ ,self.canv) item.show() print "TestClass: bdBox:"\ ,item.boundingRect().left(),item.boundingRect().bottom()\ ,item.boundingRect().right(),item.boundingRect().top() self.canvItems.append(item) self.canv.update() self.canvView.show() def main(args): app=QApplication(args) testObj=TestClass() app.setMainWidget(testObj) testObj.show() app.exec_loop() if __name__ == "__main__": main(sys.argv) _______________________________________________ PyKDE mailing list PyKDE@mats.imk.fraunhofer.de http://mats.imk.fraunhofer.de/mailman/listinfo/pykde