2012-06-08 9 views
5

Ich versuche, einen Bogen mit etwas Text zu erstellen. Ich kann den Bogen erstellen und den Text zusammen mit der Kurve platzieren. Aber bis jetzt kann ich keinen Weg finden, ro Text senkrecht zur Kurve zu drehen. Hier ist der Code ISo erstellen Sie einen Text zusammen mit der Kurve mit QPainterPath

from __future__ import division 
import os 
import sys 
from PyQt4 import QtGui,QtCore 
import math 

class PathPaintTest(QtGui.QFrame): 


    def __init__(self, *args): 
     super (PathPaintTest, self).__init__(*args) 
     self.setMaximumSize(250, 110) 
     self.setMinimumSize(250, 110) 
     self.setFrameShape(QtGui.QFrame.WinPanel) 
     self.setFrameShadow(QtGui.QFrame.Sunken) 

    def paintEvent(self, event): 
     hw = QtCore.QString("Hello World") 
     drawWidth = self.width()/100 
     painter = QtGui.QPainter(self) 
     pen = painter.pen() 
     pen.setWidth(drawWidth) 
     pen.setColor(QtGui.QColor(QtCore.Qt.red)) 
     painter.setPen(pen) 
     painter.translate(5,0) 
     cc1 = QtCore.QPointF(5, -15) 
     cc2 = QtCore.QPointF(220, -15) 
     path1 = QtGui.QPainterPath(QtCore.QPointF(5, 140)) 
     path1.cubicTo(cc1, cc2, QtCore.QPointF(240, 140)) 
     painter.drawPath(path1) 

     pen.setColor(QtGui.QColor(QtCore.Qt.yellow)) 
     painter.setPen(pen) 
     font = painter.font() 
     font.setPixelSize(drawWidth * 5) 
     painter.setFont(font) 
     percentIncrease = 1/(hw.size() + 1) 
     perecent = 0 
     for i in range(hw.size()): 
      perecent+=percentIncrease 
      point = QtCore.QPointF(path1.pointAtPercent(perecent)) 
      painter.drawText(point,QtCore.QString(hw[i])) 

     QtGui.QFrame.paintEvent(self,event) 


class TextTest(QtGui.QWidget): 
    def __init__(self): 
     super(TextTest, self).__init__() 
     self.initUI() 

    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Escape: 
      self.close() 

    def initUI(self): 
     self.mypb = PathPaintTest() 
     hbox = QtGui.QHBoxLayout() 
     hbox.addWidget(self.mypb) 

     vbox = QtGui.QVBoxLayout() 
     vbox.addLayout(hbox) 

     self.setLayout(vbox) 
     self.setGeometry(1900, 500, 450, 180) 
     self.setWindowTitle('Text Test') 

def run(): 

    app = QtGui.QApplication(sys.argv) 
    ex = TextTest() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    run() 

bin versucht, aber ich versuche http://zrusin.blogspot.com/2006/11/text-on-path.html etwas in der Nähe zu diesem Post zu erreichen. Wie Text möchte basierend auf dem Winkel gedreht werden. Irgendeine Idee, wie ich mit QPainterPath und QPainter oder anderen Methoden machen kann?

Ich suche eine Ausgabe wie diese wegen weniger Ruf

http://i.stack.imgur.com/zG9uE.jpg

leider das Bild Link für das Setzen ich nicht in der Lage bin Bild zu meinem Beitrag hinzuzufügen.

EDIT:

Hier einige aktualisierte Version .. seine Python-Version von qt-project.org/faq/answer/how_do_i_make_text_follow_the_line_curve_and_angle_of_the_qpainterpath

from __future__ import division 
import os 
import sys 
from PyQt4 import QtGui,QtCore 
import math 

class PathPaintTest(QtGui.QFrame): 


    def __init__(self, *args): 
     super (PathPaintTest, self).__init__(*args) 
     self.setMaximumSize(250, 110) 
     self.setMinimumSize(250, 110) 
     self.setFrameShape(QtGui.QFrame.WinPanel) 
     self.setFrameShadow(QtGui.QFrame.Sunken) 

    def paintEvent(self, event): 
     hw = QtCore.QString("Hello World") 
     drawWidth = self.width()/100 
     painter = QtGui.QPainter(self) 
     pen = painter.pen() 
     pen.setWidth(drawWidth) 
     pen.setColor(QtGui.QColor(QtCore.Qt.red)) 
     painter.setPen(pen) 
     painter.translate(5,0) 

     c1 = QtCore.QPointF(5, -15) 
     c2 = QtCore.QPointF(220, -15) 
     path = QtGui.QPainterPath(QtCore.QPointF(5, 140)) 
     path.cubicTo(c1, c2, QtCore.QPointF(240, 140)) 
     painter.drawPath(path) 

     pen.setColor(QtGui.QColor(QtCore.Qt.green)) 
     painter.setPen(pen) 
     font = painter.font() 
     font.setPixelSize(drawWidth * 10) 
     painter.setFont(font) 
     perecentIncrease = 1/(hw.size() + 1) 
     perecent = 0 

     for i in range(hw.size()): 
      perecent+=perecentIncrease 
      point = QtCore.QPointF(path.pointAtPercent(perecent)) 
      angle = path.angleAtPercent(perecent) 
      rad = math.radians(angle) 
      sina = math.sin(rad) 
      cosa = math.cos(rad) 
      deltaPenX = cosa * pen.width() 
      deltaPenY = sina * pen.width() 
      newX = (cosa * point.x()) - (sina * point.y()) 
      newY = (cosa * point.y()) + (sina * point.x()) 
      deltaX = newX - point.x() 
      deltaY = newY - point.y() 
      tran = QtGui.QTransform(cosa,sina,-sina,cosa,-deltaX + deltaPenX,-deltaY - deltaPenY) 
      painter.setWorldTransform(tran) 
      painter.drawText(point,QtCore.QString(hw[i])) 

     QtGui.QFrame.paintEvent(self,event) 


class TextTest(QtGui.QWidget): 
    def __init__(self): 
     super(TextTest, self).__init__() 
     self.initUI() 

    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Escape: 
      self.close() 

    def initUI(self): 
     self.mypb = PathPaintTest() 
     hbox = QtGui.QHBoxLayout() 
     hbox.addWidget(self.mypb) 

     vbox = QtGui.QVBoxLayout() 
     vbox.addLayout(hbox) 

     self.setLayout(vbox) 
     self.setGeometry(300, 200, 500, 250) 
     self.setWindowTitle('Text Test') 

def run(): 

    app = QtGui.QApplication(sys.argv) 
    ex = TextTest() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    run() 

aber immer noch kann ich nicht verwalten, die Drehung zu bekommen.

UPDATE:

habe ich es jetzt hier arbeiten, ist der aktualisierte Abschnitt, vielleicht wird es jemand anderes auch helfen.

painter.save() 
    painter.translate(point) 
    painter.rotate(-angle) 
    painter.drawText(QtCore.QPoint(0, -pen.width()),QtCore.QString(hw[i])) 
    painter.restore(); 
+1

Sie sollten Sie mit der Lösung beantworten und akzeptieren es so diese Frage nicht als unaswered getaggt – CoppolaEmilio

Antwort

1
painter.save() 
painter.translate(point) 
painter.rotate(-angle) 
painter.drawText(QtCore.QPoint(0, -pen.width()),QtCore.QString(hw[i])) 
painter.restore(); 

meine eigene Frage zu beantworten, weil der Kommentar und sorry für die späte Antwort :)