Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Changer le contenu d'une fenêtre

Sujet résolu
23 février 2013 à 19:46:08

Bonjour tout le monde, je cherche à changer le contenu d'une fenêtre, je m'explique :

J'ai pour l'instant une fenêtre qui contient actuellement plein de widgets, et j'aimerais que, si on appuie sur un bouton, une nouvelle fenêtre s'affiche (j'ai bien dit s'affiche, et pas "une nouvelle fenêtre s'ouvre").

Concrètement, voilà mon code :

void FenetrePrinc::createButton(){
	this->_button=new QPushButton("Changer de fenêtre",this);
QObject::connect(this->_registerButton,SIGNAL(clicked()),this,SLOT(replaceFrame()));
}

void FenetrePrinc::replaceFrame(){
	AutreFenetre* currentWindow=new AutreFenetre();
	currentWindow->show();
}
Avec FenetrePrinc qui est le nom de la classe de ma fenêtre principale
AutreFenetre qui est le nom d'une autre classe et avec laquelle j'aimerais remplir la fenêtre actuelle.

Pour l'instant le code ouvre une nouvelle fenêtre.

Si quelqu'un avait des idées, merci :)

J'ai entendu parlé d'une classe QStackedWidget qui permettait de stocker des widgets et qui pourrait m'aider est-ce possible ?

Si oui, est ce que je pourrais avoir un exemple de fonctionnement qui pourrait m'aider dans mon cas ?

Grand merci

-
Edité par RaphaD 23 février 2013 à 19:50:47

  • Partager sur Facebook
  • Partager sur Twitter
23 février 2013 à 20:50:47

Je vois plusieurs manière de faire cela :

1. Tu détruis tout le contenu de la première fenêtre, et tu en reconstruit une deuxième. Je doute que ce soit adapté à ce que tu fais, mais je voulais quand même le mentionner

2. Mettre des widgets cachés (grâce à QWidget::setVisible(true) ou QWidget::hide()) dans la fenêtre. Les rendre visible lors de l'appui sur le bouton et en cacher d'autres.

3. Le plus propre à mon goût, et le plus adapté si on est amené à switché "régulièrement" d'une fenêtre à l'autre : avec les QStackedWidget. Ils sont très simples à utiliser, il suffit d'ajouter des widgets avec addWidget, et on sélectionne le widget à afficher avec setCurrentWidget ou setCurrentIndex.

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2013 à 1:48:49

1. ça ne convient pas : ça "détruit" l'ancienne fenêtre et ça ouvre une nouvelle, mais en effet, c'est bon de le mentionner

2. ça signifie avoir beaucoup beaucoup beaucoup d'attributs (je devrais avoir au moins 10 fenêtres différentes), et je préférerais avoir un code bien découpé afin de m'y retrouver plus facilement

3. J'ai vu en effet que ça avait l'air relativement pratique, mais je vois mal le fonctionnement en général, et plus particulièrement dans mon cas où chaque classe que j'ai représente une fenêtre différente. Saurais-tu m'expliquer comment faire ?

Merci d'avance :)

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2013 à 8:16:46

Stock tout tes widgets dans un layout et dès que tu veux changer le contenu de ta fenêtre, tu aura juste a changer de layout principal.
  • Partager sur Facebook
  • Partager sur Twitter
Mon premier cours sur OCR : [C++/Qt] Créer un updater pour son programme
24 février 2013 à 12:16:39

Voici un exemple pour voir comment l'utiliser. Pour changer de fenêtre, le principe, c'est que ta fenêtre actuelle va envoyer un signal avec le numéro de la nouvelle fenêtre à afficher en paramètre.

#ifndef FENETRE_PRINCIPALE
#define FENETRE_PRINCIPALE

#include <QApplication>
#include <QtGui>

#include "FenetreSecondaire1.h"
#include "FenetreSecondaire2.h"
#include "FenetreSecondaire3.h"
#include "FenetreSecondaire4.h"


class FenetrePrincipale : public QMainWindow
{
	Q_OBJECT
	
	public:
		FenPri();
		~FenPri();
		
		
	public slots:
		void slotDisplayFen(int fenIndex);
		
	
	private:
		QStackedWidget *stack;
		FenetreSecondaire1 *fen1;
		FenetreSecondaire2 *fen2;
		FenetreSecondaire3 *fen3;
		FenetreSecondaire4 *fen4;
};


#endif





#include "FenetrePrincipale.h"


FenetrePrincipale::FenetrePrincipale() : QMainWindow()
{
	stack = new QStackedWidget(this);
	fen1 = new FenetreSecondaire1(this);
	fen2 = new FenetreSecondaire2(this);
	fen3 = new FenetreSecondaire3(this);
	fen4 = new FenetreSecondaire4(this);
	
	stack->addWidget(fen1);
	stack->addWidget(fen2);
	stack->addWidget(fen3);
	stack->addWidget(fen4);
	
	this->setCentralWidget(stack);
	statck->setCurrentIndex(0); // on affiche la première fenêtre à l'ouverture du programme
	
	connect(fen1, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
	connect(fen2, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
	connect(fen3, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
	connect(fen4, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
}


FenetrePrincipale::~FenetrePrincipale()
{
	
}


void FenetrePrincipale::slotDisplayFen(int fenIndex)
{
	if ((fenIndex < 0) || (fenIndex > 3)) {return;}
	stack->setCurrentIndex(fenIndex);
}



-
Edité par 3noix 24 février 2013 à 12:19:30

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2013 à 16:33:32

Ok merci, je test avant de mettre "résolu".

Je vous tiens au courant ;)

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2013 à 17:31:11

Voilà, j'ai enfin réussi à avoir un résultat satisfaisant ( changement de fenêtre quand on clique sur un bouton, ... )

Grand merci ! :)

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2013 à 17:43:28

Je n'y pense que maintenant, mais il y a aussi les QTabWidget pour faire des onglets... si jamais ca correspond mieux à ce que tu veux faire
  • Partager sur Facebook
  • Partager sur Twitter
24 février 2013 à 18:40:21

Non, j'avais besoin de recharger la fenêtre de fond en comble la solution que tu m'as donné avant est juste parfaite ! :)
  • Partager sur Facebook
  • Partager sur Twitter
4 août 2013 à 21:25:30

Excusez moi de deterrer ce topic mais j'ai besoin d'aide , j'ai le meme probleme que cet utilisateur , je voudrais pouvoir changer le contenu de ma fenetre apres avoir cliqué sur un bouton , j'ai creer une classe pour ma nouvelle fenetre mais je narrive pas a faire le signal , j'ai essayez comme sa 
 fen1=new fenetreperso;

              QObject::connect(m_bouton_jouer, SIGNAL(clicked()), fen1, SLOT(show()));

C'est bien mais sa m'affiche le contenu que je veux dans une nouvelle fenetre pas dans celle actuelle , pourriez vous m'aider ?

Je reformule ma question simplement pour les flemmards :p

Comment remplacer le contenu d'une fenetre par le contenu d'une autre fenetre dans la meme page ? :)

Merci bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
Live to learn
Anonyme
4 août 2013 à 22:45:00

On peut aussi utiliser un QStackedWidget pour faire le job.
  • Partager sur Facebook
  • Partager sur Twitter
4 août 2013 à 22:56:46

tu peux developper? a quoi il sert , comment sen servir?

  • Partager sur Facebook
  • Partager sur Twitter
Live to learn
4 août 2013 à 23:36:44

Salut,

Je t'invite à poster la question dans un nouveau topic, ce sera plus simple pour tout le monde de s'y retrouver.

Merci de ta compréhension et bon courage pour ton problème. :) GuilOooo

  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.