Bonjour à tous,

Dans une scène et une vue associée, je dispose, ajoute, supprime, bouge redimensionne des items (panneaux/rectangles, textes, ...) ; là rien de bien difficile.

Ce qui me pose problème est que je voudrais travailler sur plusieurs pages (plusieurs scènes, plusieurs vues ?).
J'ai fait un script ultra basique pour argumenter ma demande. Dans ce script je crée des pages à partir du combo et je voudrais associer chaque page créé à une nouvelle scène/vue afin de produire un document final multipage (autant que possible).

Les différentes pages/vues/scènes correspondraient en quelque sorte à des calques (qui se superposeraient les uns les autres). Sur les différentes pages on aurait bien entendu la possibilité de disposer des items (panneaux/rectangles, textes, ...) ... et en naviguant entre les pages (par l'intermédiaire du combo), on pourrait rajouter/enlever/traiter les items.

Je me pose la question quant à la stratégie à mettre en place pour y arriver, avez-vous des idées ?, des exemples à montrer ?

J'espère que vous pourrez m'aider.

Bonne journée, bon week-end.

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
# Imports PyQt5 -----------------------------------------------------------------------
from PyQt5.QtCore import (Qt, QRectF)
from PyQt5.QtWidgets import (QPushButton, QWidget, QVBoxLayout, QSpinBox, QLabel, 
                             QComboBox, QHBoxLayout, QGraphicsScene, QGraphicsView, 
                             QSlider, QGraphicsPixmapItem, QApplication, QGraphicsItem)
from PyQt5.QtGui import (QColor, QBrush, QPixmap, QTransform, QPen, QPainterPath, QPainter)
# ------------------------------------------------------------------------------------
 
import sys, os
 
class GraphiqueScene(QGraphicsScene) :
 
    def __init__(self, parent = None) :
        super(GraphiqueScene, self).__init__(parent)
 
 
class GraphiqueVue(QGraphicsView) :
 
    backgroundcolor = QColor(100, 100, 100)
 
    def __init__(self, parent = None) :
        super(GraphiqueVue, self).__init__(parent)
 
        self.setBackgroundBrush(self.backgroundcolor)
 
        self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing)
        self.setRenderHint(QPainter.TextAntialiasing)
        self.setDragMode(QGraphicsView.RubberBandDrag)
 
 
class GraphiqueMain(QWidget):
    def __init__(self):
        super(GraphiqueMain, self).__init__()
 
        self.setWindowTitle("Demande d'aide pour multipage/multiscènes")
 
        self.setGeometry(20, 40, 1200, 760)
        self.setMinimumSize(1200, 760)
 
 
        bout_ajouter_page = QPushButton("Ajouter page")
        bout_supprimer_page = QPushButton("Supprimer page")
        bout_ajout_panneau = QPushButton("Ajouter panneau")
        bout_supp_panneau = QPushButton("Supprimer panneau")
        bout_taille_adaptee = QPushButton("Taille adaptée")
 
        liste_pages = ["Page 1"]
        self.combo_pages = QComboBox()
        for page in liste_pages :
            self.combo_pages.addItem(page)
        self.combo_pages.setMinimumHeight(28)
 
        self.slider_redimensionnement = QSlider()
        self.slider_redimensionnement.setOrientation(Qt.Horizontal)
        self.slider_redimensionnement.setMinimum(100)
        self.slider_redimensionnement.setMaximum(3000)
        self.slider_redimensionnement.setValue(500)
        self.slider_redimensionnement.setSingleStep(1)
        self.slider_redimensionnement.setFixedWidth(150)
 
        # --------------------------------------------
        self.scene  = QGraphicsScene()
        self.graphique_vue = GraphiqueVue(self.scene)
        # --------------------------------------------
 
        # Ici mettre une image à charger
        self.affichage_vue('./page_blanche_portrait_150_dpi_1240x1754.png')
 
        hbox_1 = QHBoxLayout()
        hbox_1.addWidget(self.graphique_vue)
        #
        vbox_1 = QVBoxLayout()
        vbox_1.addWidget(bout_ajouter_page)
        vbox_1.addWidget(bout_supprimer_page)
        vbox_1.addWidget(QLabel("Pages à sélectionner :"))
        vbox_1.addWidget(self.combo_pages)
        vbox_1.addWidget(bout_ajout_panneau)
        vbox_1.addWidget(bout_supp_panneau)
        vbox_1.addWidget(QLabel("Redimensionner :"))
        vbox_1.addWidget(self.slider_redimensionnement)
        vbox_1.addWidget(bout_taille_adaptee)
        #
        vbox_1.setAlignment(Qt.AlignVCenter)
        #
        hbox_layout = QHBoxLayout()
        hbox_layout.addLayout(hbox_1)
        hbox_layout.addLayout(vbox_1)
        #hbox_layout.setStretch(0, 1)
        #
        self.setLayout(hbox_layout)
 
        # Signaux
        bout_ajouter_page.clicked.connect(self.ajouter_page)
        self.combo_pages.currentIndexChanged.connect(self.afficher_num_page)
        bout_supprimer_page.clicked.connect(self.supprimer_page)
        bout_ajout_panneau.clicked.connect(self.ajouter_panneau)
        bout_supp_panneau.clicked.connect(self.supprimer_item)
        self.slider_redimensionnement.valueChanged.connect(self.redimensionner_selection)
        bout_taille_adaptee.clicked.connect(self.afficher_zoom_taille_adaptee)
 
 
    def affichage_vue(self, image) :
        pixmap = QPixmap(image)
        item = QGraphicsPixmapItem(pixmap)
        item.setTransformationMode(Qt.SmoothTransformation)
        self.scene.addItem(item)
        self.graphique_vue.setScene(self.scene)
        x, y = 0, 0
        self.scene.setSceneRect(0, 0, pixmap.width(), pixmap.height())
        self.graphique_vue.centerOn(x, y)
        self.graphique_vue.setAlignment(Qt.Alignment(Qt.AlignHCenter|Qt.AlignVCenter))
        self.graphique_vue.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
        self.graphique_vue.update()
 
 
    def ajouter_page(self) :
        self.combo_pages.addItem("Page {}".format(self.combo_pages.count() + 1))
 
 
    def supprimer_page(self) :
        if self.combo_pages.count() > 1 :
            self.combo_pages.removeItem(self.combo_pages.currentIndex())
 
 
    def afficher_num_page(self) :
        print("Index sélectionné : {}".format(self.combo_pages.currentIndex()))
 
 
    def ajouter_panneau(self) :
        contour = QPen(QColor(0, 0, 0, 255), 15)
        contour.setStyle(Qt.DotLine)
        contour.setCapStyle(Qt.RoundCap)
        contour.setJoinStyle(Qt.RoundJoin)
        chemin = QPainterPath()
        chemin.addRoundedRect(QRectF(10, 10, 740, 200), 30, 30)
        rectangle = self.scene.addPath(chemin, pen = contour, brush = QBrush(QColor(120, 136, 145, 160)))
        rectangle.setFlag(QGraphicsItem.ItemIsMovable)
        rectangle.setFlag(QGraphicsItem.ItemIsSelectable)
 
 
    def supprimer_item(self) :
        print(self.graphique_vue.scene().selectedItems())
        #for item in self.scene.selectedItems() :
        for item in self.graphique_vue.scene().selectedItems() :
            self.scene.removeItem(item)
            del item
 
 
    def redimensionner_selection(self, valeur) :
        for item in self.scene.selectedItems() :
            transform = QTransform()
            transform.scale(valeur/1000, valeur/1000)
            item.setTransform(transform)
            self.update()
 
 
    def afficher_zoom_taille_adaptee(self) :
        self.graphique_vue.setAlignment(Qt.Alignment(Qt.AlignHCenter|Qt.AlignVCenter))
        self.graphique_vue.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = GraphiqueMain()
    ex.show()
    sys.exit(app.exec_())