2012-06-08 14 views
5

का उपयोग कर वक्र के साथ एक पाठ कैसे बनाएं I कुछ पाठ के साथ एक चाप बनाने की कोशिश कर रहा हूं। मैं चाप बनाने में सक्षम हूं और मैं पाठ को वक्र के साथ रख सकता हूं। लेकिन अब तक मैं घुमावदार पाठ को लंबवत पाठ घुमाने के लिए रास्ता नहीं ढूंढ सकता। यहाँ कोड मैं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() 

के अपने अजगर संस्करण है .. लेकिन अभी भी मैं नहीं कर सकते रोटेशन पाने के लिए लेते हैं।

अद्यतन:

मैं यहाँ अब काम मिल गया अद्यतन अनुभाग है, हो सकता है यह किसी को भी कुछ एक में मदद मिलेगी।

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(); 

देर जबाब :)