Salut,
Je souhaite créer une interface qui serait composée d'une fenêtre principale (QMainWindow), d'un widget central (là où tout se passe) et d'une barre verticale gauche permettant de switcher entre différents widgets qui remplacent tour à tour le widget central. C'est sur ce dernier point que je sèche. Je pense que ce n'est pas compliqué, mais faute de vocabulaire je galère à trouver un exemple sur le net (et à expliquer clairement ce que je souhaite ici par la même occasion..).
Pour ceux qui connaissent, je souhaite faire un peu ce que propose QtCreator: une barre vertical à gauche.
Je suis parti pour cela sur une QToolBar.
Voici une classe définissant un widget, pour l'exemple je créé plusieurs instances de ce même widget, mais à terme chacun représente une fenêtre bien plus complexe.
Si je devais me limiter à cela je ferais:
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 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from functools import partial class MyWidget(QWidget): def __init__(self, parent=None, text=''): super(MyWidget, self).__init__(parent) label = QLabel(text) label.setAlignment(Qt.AlignCenter) label.setStyleSheet("QLabel {background-color: red;}") layout = QHBoxLayout() layout.addWidget(label) self.setLayout(layout) self.setVisible(False)
Bien, maintenant ma QMainWindow (désolé, pour être executable il faut quelques images pour les QActions que je ne joins pas):
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 class App(QMainWindow): def __init__(self, parent=None): super(App, self).__init__(parent) widget = MyWidget(self, 'Weeeeedget!') widget.setVisible(True) self.setCentralWidget(widget) self.show() if __name__ == '__main__': app = QApplication(sys.argv) form = App() sys.exit(app.exec_())
A l'initialisation je crée plusieurs widgets que je stocke dans un dictionnaire. L'idée c'est de lié les QActionsde la barre verticale de sorte à rendre visible ou non le bon widget. Mon problème c'est que je ne vois pas comment placer ces widgets dans la fenêtre. Si je défini un layout j'ai droit à un message d'erreur car je mixe les layouts des widgets et de la fenêtre.
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 class ToolBarDemo(QMainWindow): def __init__(self, parent=None): super(ToolBarDemo, self).__init__(parent) self.initUI() def initUI(self): self.init_toolbar() self.init_simu_panel() main_widget = QWidget(self) # Build some widgets self._widgets = {} for i in range(3): widget = MyWidget(self, 'Widget %i' % i) self.setCentralWidget(widget) # Probleme ici self._widgets[i] = widget self.setWindowTitle('Toolbar Demo!!') self.show() def init_simu_panel(self): toolbar = QToolBar('Simulations') toolbar.setOrientation(Qt.Vertical) toolbar.setMovable(False) toolbar.setFloatable(False) toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.addToolBar(Qt.LeftToolBarArea, toolbar) action = QAction(QIcon('home.png'), 'Dummy', self) action.triggered.connect(partial(self.switch_widget, 0)) toolbar.addAction(action) action = QAction(QIcon('home.png'), 'Dummy', self) action.triggered.connect(partial(self.switch_widget, 1)) toolbar.addAction(action) action = QAction(QIcon('home.png'), 'Dummy', self) action.triggered.connect(partial(self.switch_widget, 2)) toolbar.addAction(action) def init_toolbar(self): toolbar = QToolBar('Toolbar') toolbar.setOrientation(Qt.Horizontal) toolbar.setMovable(False) toolbar.setFloatable(False) self.addToolBar(toolbar) action = QAction(QIcon('run.png'), 'run', self) action.triggered.connect(self.cbk_run) toolbar.addAction(action) action = QAction(QIcon('stop.png'), 'stop', self) action.triggered.connect(self.cbk_stop) toolbar.addAction(action) def switch_widget(self, widget_id): for name, widget in self._widgets.items(): if name == widget_id: widget.setVisible(True) else: widget.setVisible(False) def cbk_run(self): print('Ruuuuuuunnnn') def cbk_stop(self): print('STOP !!')
Alors, comment placer tous ces widgets en mode "plein écran", centré, et les uns sur les autres?
Peut-être que je fais fausse route et qu'il y a une autre voie pour faire ce genre de choses.
Ciao,
Julien
Partager