Je débute avec Qt et je ne trouve pas comment faire pour changer le contenu d'une fenêtre sans ouvrir une nouvelle fenêtre avec un bouton puis revenir au premier contenu. Par exemple au départ il y aurait 2 boutons ("Page 1" et "Page 2") sur la fenêtre puis lorsque qu'on appuierait sur le premier bouton ("Page 1") le contenue de la fenêtre changerait le contenu est sans importance ici malgré la présence d'un bouton "Retour" et quand on appuierait dessus on reviendrait au premier contenu avec les 2 boutons.
Un QStackWidget est bien adapté dans ce cas là. Tu créés tes différentes vues dans des widgets différents et tu les ajoutes à ton stack widget. Ensuite tu peux faire des setCurrentIndex en fonction de la page que tu veux afficher.
Oui avec un QStackWidget j'ai réussi a acceder a ma "Page 1" mais comment faire pour faire le bouton "Retour" ?
Car le QStackWidget est dans la class de ma fenêtre principale (la page menu avec les 2 boutons "Page 1" et "Page 2") donc je ne peux pas faire de "setCurrentIndex" via le nouveau contenu ?
Après libre à toi de l'ajouter dans le stack widget (ou non d'ailleurs).
C'est à toi de coder le bouton retour sur ta page principale, je ne pense pas que tu aies de trucs tout fait dans Qt. Tu peux avoir des connexions de ce style :
Mon QStackWidget ainsi que mes différentes pages je les créés dans le main ? Car il faut que je puisse faire un setCurrentIndex depuis nimporte quelle page. ^^'
Est-ce qu'il est possible de faire des SLOTS pour accéder à chaque page dans mon main pour qu'ils soient utilisables depuis nimporte quelle class (1 class par page) ?
C'est ta classe qui a le stack widget qui gère ça.
Je te conseille d'avoir un bouton de retour sous ton StackWidget et pas dedans s'il est commun aux différentes pages. Tu le caches dans le showMainPage, tu l'affiche dès que l'on bascule sur une autre page.
C'est pas aux classes qui représentent les différentes pages de gérer le changement.
Et dans le cas où le bouton de retour est dans chaque page (ce que je ne te conseille pas mais imaginons s'il doit être différent pour chaque page), alors c'est la classe de la page qui doit émettre un signal back qui dans tous les cas doit être géré par ta classe qui a le stack widget (qu'il soit récupéré directement depuis le bouton ou depuis les classes des pages).
Pour résumer voici ce que je voudrais faire sous forme de schéma
Donc une class mainPage, une class page1 et une class page2
mainPage aurait deux boutons un qui afficherait la page1 et un autre bouton qui afficherais la page2
page1 et page2 on un bouton retour qui affiche la mainPage
Ces 3 pages seraient dans un QStackWidget pour les afficher avec un setCurrentIndex.
Maintenant ou est-ce que je doit mettre ce QStackWidget (dans le main? dans une autre class? dans une des 3 pages ?)
Et comment je fais pour changer de page sachant que les "connect" des boutons sont dans leurs class respective ?
Désolé je reformule car j'ai compris dans le principe ce que tu me dis mais je ne vois pas comment faire principalement pour émettre un signalback qui doit être géré par la class qui a le stackWidget
Où tu dois mettre le stack widget je ne sais pas moi. Ca dépend d'où il se situe dans ton application. Ca peut très bien être dans ta MainWindow comme ailleurs. Le stack widget est un widget donc tu peux le mettre où tu veux. Mais il va contenir les 3 pages donc il n'est pas dans l'une d'entre elles.
Après pour la gestion, je t'ai conseillé d'avoir le bouton de retour en dehors de ton stack widget. Mais dans le cas où il est dans ta page 1 et ta page 2 tu peux connecter un signal à un signal donc tes classes page1 et page2 doivent retransmettre le signal :
class Page1 : public QWidget
{
public:
Page1()
{
connect(backButton, &QPushButton::clicked, this, &Page1::back);
}
signals;
void back();
};
Je connecte le signal à une lambda dans le cas où il n'y a qu'une ligne, mais tu peux très bien le connecter à une méthode de classe comme tu sais le faire.
Quand tu sélectionnes une ligne dans le ComboBox, ça te bascule sur la fenêtre correspondante. Ici, j'ai pris un ComboBox parce que c'est le plus simple, mais tu peux faire la même chose avec un QListWidget, un QTreeView...
J'ai réussi a faire une class pour gérer mon stackWidget ainsi que mes fenêtres, ensuite quand j'appuis sur le bouton un signal est bien émit (en tout cas le programme rentre bien dans le slot) mais je ne comprend pas pourquoi ce n'est pas récupéré par ma class qui gère le stackWidget
FenPrinc.cpp
#include "FenPrinc.h"
#include <iostream>
FenPrinc::FenPrinc() : QWidget()
{
layout = new QFormLayout(this);
nom = new QLineEdit;
prenom = new QLineEdit;
age = new QLineEdit;
bouton = new QPushButton("Changer fenetre");
layout->addRow("&Nom : ", nom);
layout->addRow("&Prenom : ", prenom);
layout->addRow("&Age : ", age);
layout->addWidget(bouton);
connect(bouton, SIGNAL(clicked()), this, SLOT(emiTest()));
}
void FenPrinc::emiTest()
{
std::cout << "clicked" << std::endl;
emit test();
}
Désolé mais je ne vais pas utiliser ta technique tout simplement car tu utilise des choses que je ne connais pas du tout ^^' mais merci quand même et si tu as une réponse a mon problème que je viens de mettre je t'écoute sans souci merci
J'ai pensé qu'il fallait inclure le "SetStackWindow.h" dans FenPrinc.h mais quand je le fais ça me fais plein d'erreur que je ne comprend pas
C'est normal, SetStackWindow.h a besoin de connaître la classe FenPrinc et FenPrinc.h a besoin de connaître SetStackWindow. Du coup ba c'est le bordel ^^. Mais la conception ne va pas.
L'héritage est bizarre. Ta fenêtre principale hérite de QWidget et ta classe SetStackWindow hérite de QMainWindow. Fait tout simplement hériter ta classe pour la fenêtre principale de QMainWindow. Et pour le QStackWidget, gère le depuis ta fenêtre principale et si besoin créé une classe custom qui hérite de QStackWidget.
J'ai essayé en faisant hériter ma fenêtre principale de QMainWindow mais ça ne change rien :/
Et je ne peux pas laisser mon QStackWidget dans ma fenêtre principale car si je fais cela je ne peux pas mettre ma fenêtre principale dedans et puis je trouve que c'est plus clair dans le code d'avoir une class par fenêtre et une class pour les gérer
Génial ça fonctionne enfin, merci beaucoup a tous je mets en sujet résolu !
[Qt] Changer le contenu d'une fenêtre
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
...