InterfaceGPS 0.1.0
Interface embarquée Qt pour navigation, multimédia, caméra et télémétrie
Chargement...
Recherche...
Aucune correspondance
mainwindow.cpp
Aller à la documentation de ce fichier.
1
9#include "mainwindow.h"
10#include "homeassistant.h"
11#include "ui_mainwindow.h"
12#include "telemetrydata.h"
13#include "navigationpage.h"
14#include "camerapage.h"
15#include "settingspage.h"
16#include "mediapage.h"
17
18#include <QStackedWidget>
19#include <QHBoxLayout>
20#include <QPushButton>
21
22MainWindow::MainWindow(TelemetryData* telemetry, QWidget* parent)
23 : QMainWindow(parent), ui(new Ui::MainWindow), m_t(telemetry)
24{
25 ui->setupUi(this);
26
27 // Format fixe : l'interface est pensée et verrouillée pour l'écran embarqué du véhicule.
28 this->setFixedSize(1280, 800);
29
30 // Configuration de la barre de navigation inférieure
31 ui->bottomNavFrame->setFixedHeight(40);
32 ui->bottomNavLayout->setContentsMargins(10, 2, 10, 2);
33 ui->bottomNavLayout->setSpacing(15);
34
35 // Priorité d'étirement : la zone de contenu prend tout l'espace disponible
36 ui->verticalLayoutRoot->setStretch(0, 1);
37 ui->verticalLayoutRoot->setStretch(1, 0);
38
39 // Instanciation des pages.
40 // Chaque page est instanciée une seule fois et reste en mémoire pour préserver son état
41 // (ex: ne pas avoir à recharger la carte OSM à chaque clic sur l'onglet Navigation).
42 m_nav = new NavigationPage(this);
43 m_cam = new CameraPage(this);
44 m_settings = new SettingsPage(this);
45 m_media = new MediaPage(this);
46 m_ha = new HomeAssistant(this);
47
48 // TelemetryData sert de bus applicatif partagé.
49 m_nav->bindTelemetry(m_t);
50
51 // Configuration du conteneur principal qui va héberger toutes les pages côte à côte.
52 QWidget* mainContainer = new QWidget(this);
53 m_mainLayout = new QHBoxLayout(mainContainer);
54 m_mainLayout->setContentsMargins(0, 0, 0, 0);
55 m_mainLayout->setSpacing(10);
56
57 m_mainLayout->addWidget(m_nav);
58 m_mainLayout->addWidget(m_cam);
59 m_mainLayout->addWidget(m_media);
60 m_mainLayout->addWidget(m_settings);
61 m_mainLayout->addWidget(m_ha);
62
63 // Remplacement de l'ancien QStackedWidget (inutilisé) par notre layout dynamique
64 int stackIndex = ui->verticalLayoutRoot->indexOf(ui->stackedPages);
65 ui->verticalLayoutRoot->insertWidget(stackIndex, mainContainer);
66 ui->stackedPages->hide();
67
68 // Connexion des boutons de la barre de navigation vers leurs slots respectifs
69 connect(ui->btnNav, &QPushButton::pressed, this, &MainWindow::goNav);
70 connect(ui->btnCam, &QPushButton::pressed, this, &MainWindow::goCam);
71 connect(ui->btnSettings, &QPushButton::pressed, this, &MainWindow::goSettings);
72 connect(ui->btnHA, &QPushButton::pressed, this, &MainWindow::goHomeAssistant);
73 connect(ui->btnMedia, &QPushButton::pressed, this, &MainWindow::goMedia);
74
75 // Création dynamique du bouton pour activer le mode Split-Screen
76 m_btnSplit = new QPushButton(this);
77 m_btnSplit->setFixedSize(45, 45);
78 m_btnSplit->setCursor(Qt::PointingHandCursor);
79
80 ui->bottomNavLayout->insertWidget(0, m_btnSplit);
81 connect(m_btnSplit, &QPushButton::pressed, this, &MainWindow::toggleSplitAndHome);
82
83 // Démarrage de l'application directement dans l'état mémorisé (Split ou Plein écran)
84 goSplit();
85}
86
88 delete ui;
89}
90
91void MainWindow::displayPages(QWidget* p1, QWidget* p2)
92{
93 // p1 est la page principale; si p2 n'est pas nul, on active le mode split.
94 m_isSplitMode = (p2 != nullptr);
95
96 // Le lecteur média adapte son interface (mode compact) si l'écran est partagé
97 m_media->setCompactMode(m_isSplitMode);
98
99 // Modification visuelle de l'icône du bouton Split
100 m_btnSplit->setText(m_isSplitMode ? "▦" : "◫");
101 m_btnSplit->setStyleSheet("QPushButton { font-size: 38px; color: white; background-color: transparent; border-radius: 12px; }"
102 "QPushButton:pressed { background-color: #2a2f3a; }");
103
104 // Parcours de tous les widgets enfants pour afficher uniquement ceux demandés
105 for (int i = 0; i < m_mainLayout->count(); ++i) {
106 QWidget* w = m_mainLayout->itemAt(i)->widget();
107 if (w) {
108 bool shouldShow = (w == p1 || w == p2);
109 w->setVisible(shouldShow);
110
111 // Gestion des proportions en mode Split (60% gauche / 40% droite)
112 if (shouldShow && m_isSplitMode) {
113 if (w == p1) m_mainLayout->setStretchFactor(w, 6);
114 else if (w == p2) m_mainLayout->setStretchFactor(w, 4);
115 }
116 }
117 }
118}
119
120void MainWindow::toggleSplitAndHome() {
121 // Si on n'est pas déjà en mode partagé, on l'active.
122 // Si on l'est déjà, l'utilisateur devra cliquer sur une application spécifique dans la barre.
123 if (!m_isSplitMode) goSplit();
124}
125
126void MainWindow::goSplit() {
127 //Le flux caméra est systématiquement arrêté hors de sa page
128 m_cam->stopStream();
129 displayPages(m_nav,m_media);
130}
131
132void MainWindow::goNav() {
133 m_cam->stopStream();
134 displayPages(m_nav);
135}
136
137void MainWindow::goMedia() {
138 m_cam->stopStream();
139 displayPages(m_media);
140}
141
142void MainWindow::goCam() {
143 // La caméra prend toujours la totalité de l'écran, pas de split possible.
144 displayPages(m_cam);
145 m_cam->startStream();
146}
147
148void MainWindow::goSettings() {
149 m_cam->stopStream();
150 displayPages(m_settings);
151}
152
153void MainWindow::goHomeAssistant() {
154 m_cam->stopStream();
155 displayPages(m_ha);
156 m_ha->setFocus();
157}
Rôle architectural : Page UI dédiée à l'affichage du flux caméra embarqué (ex: vue recul ou Bird-eye)...
Contrôleur de la vue caméra. Cette classe écoute sur un port UDP spécifique (4444) pour recevoir des ...
Definition camerapage.h:29
void startStream()
Démarre l'écoute du flux vidéo entrant. Ouvre le port UDP 4444 et se met en attente de datagrammes....
void stopStream()
Arrête l'écoute du flux vidéo entrant. Ferme le port UDP et efface la dernière image affichée....
Page principale affichant le dashboard domotique. Gère l'initialisation du moteur de rendu Chromium (...
Fenêtre principale agissant comme conteneur parent de toutes les vues de l'application....
Definition mainwindow.h:32
MainWindow(TelemetryData *telemetry, QWidget *parent=nullptr)
Constructeur de la fenêtre principale.
~MainWindow()
Destructeur. Libère l'interface générée par Qt Designer.
Page graphique dédiée à la gestion des médias (musique, Bluetooth). Cette classe agit comme un pont (...
Definition mediapage.h:22
void setCompactMode(bool compact)
Adapte l'interface du lecteur multimédia en fonction de l'espace disponible. Cette fonction est appel...
Definition mediapage.cpp:45
Contrôleur de la page de navigation GPS. Héberge la carte (codée en QML) au sein de l'interface C++....
void bindTelemetry(TelemetryData *t)
Connecte le bus de télémétrie à la carte.
Interface graphique de gestion des paramètres et des connexions sans fil. Permet de rendre le véhicul...
Classe représentant les données en temps réel du véhicule. Cette classe hérite de QObject et centrali...
Rôle architectural : Intégration embarquée de l'interface Home Assistant.
Rôle architectural : Orchestrateur principal des pages du tableau de bord.
Rôle architectural : Conteneur Widget de l'expérience multimédia QML.
Rôle architectural : Façade Widget de la navigation cartographique.
Rôle architectural : Page de configuration système et Bluetooth utilisateur.
Rôle architectural : Modèle central de télémétrie partagé entre les modules C++ et l'interface QML.