2012-06-08 1 views
5

일부 텍스트가있는 호를 작성하려고합니다. 저는 호를 만들 수 있고 텍스트를 커브와 함께 배치 할 수 있습니다. 그러나 지금까지 커브에 수직으로 텍스트를 회전시키는 방법을 찾을 수 없습니다. 는 여기에 내가 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() 

을하려하지만이 게시물 http://zrusin.blogspot.com/2006/11/text-on-path.html에 가까운 무언가를 달성하기 위해 노력하고 코드입니다. 텍스트가 각도에 따라 회전되기를 원합니다. QPainterPath 및 QPainter 또는 다른 방법으로 어떻게 할 수 있습니까?

나는 때문에 내가 내 게시물에 이미지를 추가 할 수 없습니다입니다 적은 평판의 이미지 링크를 넣어이

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

죄송 같은 출력을 찾고 있어요.

는 편집 :

여기

는 .. 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() 

자사의 파이썬 버전 일부 업데이트 된 버전입니다하지만 여전히 나는 회전을 얻기 위해 관리 기운 다.

UPDATE :

내가 지금 여기 일을 가지고는 아마 다른 일부를 도움이 될 것입니다, 업데이트 된 섹션입니다.

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

당신은 솔루션을 대답과 이용 약관을 읽고 동의를해야합니다에 대한 주석 때문에 내 자신의 질문에 대답하고 미안하면이 질문 unaswered로 태그되지 않도록 – CoppolaEmilio

답변

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

후반 응답 :