1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#!/usr/bin/env python
"""PyQt4 port of the richtext/textobject example from Qt v4.x"""
# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QVariant', 2)
from PyQt4 import QtCore, QtGui, QtSvg
class SvgTextObject(QtGui.QPyTextObject):
def intrinsicSize(self, doc, posInDocument, format):
renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData))
size = renderer.defaultSize()
if size.height() > 25:
size *= 25.0 / size.height()
return QtCore.QSizeF(size)
def drawObject(self, painter, rect, doc, posInDocument, format):
renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData))
renderer.render(painter, rect)
class Window(QtGui.QWidget):
SvgTextFormat = QtGui.QTextFormat.UserObject + 1
SvgData = 1
def __init__(self):
super(Window, self).__init__()
self.setupGui()
self.setupTextObject()
self.setWindowTitle("Text Object Example")
def insertTextObject(self):
fileName = self.fileNameLineEdit.text()
file = QtCore.QFile(fileName)
if not file.open(QtCore.QIODevice.ReadOnly):
QtGui.QMessageBox.warning(self, "Error Opening File",
"Could not open '%s'" % fileName)
svgData = file.readAll()
svgCharFormat = QtGui.QTextCharFormat()
svgCharFormat.setObjectType(Window.SvgTextFormat)
svgCharFormat.setProperty(Window.SvgData, svgData)
try:
# Python v2.
orc = unichr(0xfffc)
except NameError:
# Python v3.
orc = chr(0xfffc)
cursor = self.textEdit.textCursor()
cursor.insertText(orc, svgCharFormat)
self.textEdit.setTextCursor(cursor)
def setupTextObject(self):
svgInterface = SvgTextObject(self)
self.textEdit.document().documentLayout().registerHandler(Window.SvgTextFormat, svgInterface)
def setupGui(self):
fileNameLabel = QtGui.QLabel("Svg File Name:")
self.fileNameLineEdit = QtGui.QLineEdit()
insertTextObjectButton = QtGui.QPushButton("Insert Image")
self.fileNameLineEdit.setText('./files/heart.svg')
insertTextObjectButton.clicked.connect(self.insertTextObject)
bottomLayout = QtGui.QHBoxLayout()
bottomLayout.addWidget(fileNameLabel)
bottomLayout.addWidget(self.fileNameLineEdit)
bottomLayout.addWidget(insertTextObjectButton)
self.textEdit = QtGui.QTextEdit()
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(self.textEdit)
mainLayout.addLayout(bottomLayout)
self.setLayout(mainLayout)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
|