Bonjour à tous,

je souhaite éditer/créer un GraphicsTextItem positionné dans un GraphicsScene.
Ca permettra à l'utilisateur de personnaliser ses impressions.

Quand on crée cet item texte une première fois, la police et la taille sont correctement définis et bien visualisés.
Par contre, quand on double clique sur cet item pour modifier la taille et la police, et bien ca ne prend pas en compte ma modif...

Si le champ est est Plain text, ca fonctionne, mais en html non
Je suppose que quand on modifie, on rajoute une "couche" à l'html au graphicstextItem qui n'est pas tenu compte ( j'espère être clair)

Y a t il une âme charitable pour m'éclairer??

Merci

Je vous poste du code pour vous faire une idée du phénomène :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
 
# -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore
 
PageSize = (595, 842)
MagicNumber = 0x70616765
FileVersion = 1
 
 
class GraphicsView(QtGui.QGraphicsView):
  def __init__(self, parent=None):
    super(GraphicsView, self).__init__(parent)
    self.setDragMode(QtGui.QGraphicsView.RubberBandDrag)
    self.setRenderHint(QtGui.QPainter.Antialiasing)
    self.setRenderHint(QtGui.QPainter.TextAntialiasing)
 
  def wheelEvent(self, event):
    factor = 1.41 ** (-event.delta() / 240.0)
    self.scale(factor, factor)
 
 
class TextItem(QtGui.QGraphicsTextItem):
  def __init__(self, text,  scene,font=QtGui.QFont("Arial", 10), matrix=QtGui.QMatrix()):
    super(TextItem, self).__init__(text)
    self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable|QtGui.QGraphicsItem.ItemIsMovable)
    self.setFont(font)
    self.setPos(10,10)
    self.setMatrix(matrix)
    scene.clearSelection()
    scene.addItem(self)
    self.setSelected(True)
 
  def parentWidget(self):
    return self.scene().views()[0]
 
  def mouseDoubleClickEvent(self, event):
    dialog = TextItemDlg(self, self.parentWidget())
    dialog.exec_()
 
 
class TextItemDlg(QtGui.QDialog):
  def __init__(self, item=None, scene=None, parent=None):
    super(QtGui.QDialog, self).__init__(parent)
    self.item = item
    self.scene = scene
    self.editor = QtGui.QTextEdit()
    self.editor.setTabChangesFocus(True)
    editorLabel = QtGui.QLabel("&Text:")
    editorLabel.setBuddy(self.editor)
    self.fontComboBox = QtGui.QFontComboBox()
    self.fontComboBox.setCurrentFont(QtGui.QFont("Arial", 10))
    fontLabel = QtGui.QLabel("&Font:")
    fontLabel.setBuddy(self.fontComboBox)
    self.fontSpinBox = QtGui.QSpinBox()
    self.fontSpinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
    self.fontSpinBox.setRange(6, 280)
    self.fontSpinBox.setValue(10)
    fontSizeLabel = QtGui.QLabel("&Size:")
    fontSizeLabel.setBuddy(self.fontSpinBox)
    self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel)
    self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
 
    if self.item is not None:
      self.editor.setHtml(self.item.toHtml())
      self.fontComboBox.setCurrentFont(self.item.font())
      self.fontSpinBox.setValue(self.item.font().pointSize())
 
    self.toolBold=QtGui.QToolButton()
    self.toolItal=QtGui.QToolButton()
    self.toolUnde=QtGui.QToolButton()
    self.toolBold.setText("G")
    font = self.toolBold.font()
    font.setBold(True)
    self.toolBold.setFont(font)
    self.toolItal.setText("I")
    font = self.toolItal.font()
    font.setItalic(True)
    self.toolItal.setFont(font)
    self.toolUnde.setText("S")
    font = self.toolItal.font()
    font.setUnderline(True)
    self.toolUnde.setFont(font)
 
    layout = QtGui.QGridLayout()
    layout.addWidget(editorLabel, 0, 0)
    layout.addWidget(self.editor, 1, 0, 1, 9)
    layout.addWidget(fontLabel, 2, 0)
    layout.addWidget(self.fontComboBox, 2, 1, 1, 2)
    layout.addWidget(fontSizeLabel, 2, 3)
    layout.addWidget(self.fontSpinBox, 2, 4, 1, 2)
    layout.addWidget(self.toolBold, 2, 6, 1, 1)
    layout.addWidget(self.toolItal, 2, 7, 1, 1)
    layout.addWidget(self.toolUnde, 2, 8, 1, 1)
    layout.addWidget(self.buttonBox, 3, 0, 1, 9)
    self.setLayout(layout)
 
    self.toolBold.clicked.connect(self.toBold)
    self.toolItal.clicked.connect(self.toItal)
    self.toolUnde.clicked.connect(self.toUnde)
    self.editor.selectionChanged.connect(self.change)
 
    self.connect(self.fontComboBox,QtCore.SIGNAL("currentFontChanged(QFont)"), self.updateUi)
    self.connect(self.fontSpinBox,QtCore.SIGNAL("valueChanged(int)"), self.updateUi)
    self.connect(self.editor, QtCore.SIGNAL("textChanged()"),self.updateUi)
    self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.accept)
    self.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject)
    self.updateUi()
 
  def change(self):
    format = self.editor.currentCharFormat()
    font = format.font()
    self.toolBold.setDown(font.bold())
    self.toolItal.setDown(font.italic())
    self.toolUnde.setDown(font.underline())
 
  def toBold(self):
    format = self.editor.currentCharFormat()
    font = format.font()
    font.setBold(not font.bold())
    format.setFont(font)
    self.editor.setCurrentCharFormat(format)
    self.toolBold.setDown(font.bold())
 
  def toItal(self):
    format = self.editor.currentCharFormat()
    font = format.font()
    font.setItalic(not font.italic())
    format.setFont(font)
    self.editor.setCurrentCharFormat(format)
    self.toolItal.setDown(font.italic())
 
  def toUnde(self):
    format = self.editor.currentCharFormat()
    font = format.font()
    font.setUnderline(not font.underline())
    format.setFont(font)
    self.editor.setCurrentCharFormat(format)
    self.toolUnde.setDown(font.underline())
 
  def updateUi(self):
    font = self.fontComboBox.currentFont()
    font.setPointSize(self.fontSpinBox.value())
    self.editor.document().setDefaultFont(font)
    self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(not self.editor.toPlainText().isEmpty())
 
  def accept(self):
    if self.item is None:
      self.item = TextItem("", self.scene)
 
    font = self.fontComboBox.currentFont()
    font.setPointSize(self.fontSpinBox.value())
    self.item.setFont(self.fontComboBox.currentFont())
    self.item.setHtml(self.editor.toHtml())
    self.item.update()
    #self.item.family = self.fontComboBox.currentFont().family()
    #self.item.pointSize = self.fontSpinBox.value()
    QtGui.QDialog.accept(self)
 
 
class ConfPDF(QtGui.QWidget):
  def __init__(self, parent=None):
    super(ConfPDF,self).__init__(parent)  
    gLayout = QtGui.QGridLayout()
    self.setLayout(gLayout)
    gBox = QtGui.QGroupBox("Options")
    gBox.setMinimumWidth(180)
    gView = GraphicsView()
    self.scene = QtGui.QGraphicsScene()
    gView.setScene(self.scene)
    rect = QtCore.QRectF(0,0,PageSize[0],PageSize[1])
    self.scene.addRect(rect,QtCore.Qt.black)
    self.scene.setSceneRect(rect)
    gLayout.addWidget(gView,0,0)
    gLayout.addWidget(gBox,0,1)
    vLayout = QtGui.QVBoxLayout()
    gBox.setLayout(vLayout)
 
    for text, slot in (
        ("Texte", self.addText),):
      button = QtGui.QPushButton(text)
      button.clicked.connect(slot)
      vLayout.addWidget(button)
 
    self.filename = QtCore.QString()
 
  def addText(self):
    dialog = TextItemDlg(scene=self.scene, parent=self)
    dialog.exec_()
 
 
 
if __name__=='__main__':
  import sys
  app=QtGui.QApplication(sys.argv)
  fen=ConfPDF()
  fen.show()
  sys.exit(app.exec_())