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
|
#!/usr/bin/env python
"""PyQt4 port of the richtext/textobject example from Qt v4.x"""
from PySide2 import QtCore, QtGui, QtSvg
class SvgTextObject(QtCore.QObject, QtGui.QTextObjectInterface):
def intrinsicSize(self, doc, posInDocument, format):
renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray())
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).toByteArray())
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(self.tr("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, self.tr("Error Opening File"),
self.tr("Could not open '%1'").arg(fileName))
svgData = file.readAll()
svgCharFormat = QtGui.QTextCharFormat()
svgCharFormat.setObjectType(Window.SvgTextFormat)
svgCharFormat.setProperty(Window.SvgData, svgData)
cursor = self.textEdit.textCursor()
cursor.insertText(u"\uFFFD", 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(self.tr("Svg File Name:"))
self.fileNameLineEdit = QtGui.QLineEdit()
insertTextObjectButton = QtGui.QPushButton(self.tr("Insert Image"))
self.fileNameLineEdit.setText('./files/heart.svg')
QtCore.QObject.connect(insertTextObjectButton, QtCore.SIGNAL('clicked()'), 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_())
|