problème Signal/Slot avec classes imbriquées avec Qt

problème Signal/Slot avec classes imbriquées avec Qt - C++ - Programmation

Marsh Posté le 09-05-2008 à 10:57:33    

Bonjour à tous!
 
( linux)
Je suis en train de créer une interface graphique pour un logiciel, et j'ai un petit soucis. Alors je vais essayer d'être clair :
-j'ai une fenêtre principale
-dans cette fenêtre j'ai mis un QTabWidget
-sur une des pages de ce QTabWidget j'ai un objet qui hérite de QTreeView
-quand je clique sur un des items de cette objet j'ai une fenêtre avec des tableaux qui s'ouvre avec des infos sur l'item cliqué.
 
Voilà en gros mon programme. J'ai tout codé de manière indépendante, puis j'ai tout assemblé. Mon problème maintenant c'est que je veux palcer un bouton sur la fenêtre principale, et que lorsque je clique sur celui-ci, ça affecte tous les objets qui suivent y compris les tableaux que j'ouvre à la fin. Quelle manière serait la plus simple?
 
Moi ce que j'ai fais, c'est faire remonter un signal à tous les objets, en créant des signaux et des slots: quand je clique sur le bouton de la fenêtre principale ça emet le signal alpha, lorsque la page du QTabWidget reçoit ce signal elle emet aussi le signal alpha, idem pour le QTreeView, et lorsque mon tableau reçoit le signal alpha il fait ce qu'il a à faire.
Mais cela ne fonctionne pas. J'ai l'impression que je signal n'est transmis qu'une fois c'est-à-dire de la fenêtre principale à la page de mon QTabWidget.
 
 
Voilà les bons de codes intéressants:
Fenêtre principale:

Code :
  1. #include "MainWindow.h"
  2. MainWindow::MainWindow(const Entreprise* E, int val) : QWidget(), m_periode(0)
  3. {
  4. Utilisateur U;
  5. InformationAlea IA;
  6. InformationEntreprise IE(E,this);
  7. Courbe C(val);
  8. C.ajouterValeur(E);
  9. m_tableau=new QTabWidget;
  10. m_tableau->addTab (U.getPage1(), "Accueil" );
  11. m_tableau->addTab (IA.getPage2(), "Informations" );
  12. m_tableau->addTab (IE.getPage3(), "Entreprises" );
  13. m_tableau->addTab (C.getMyPlot(), "Graphes" );
  14. m_boutonSuite=new QPushButton("Passer a la periode suivante", this);
  15. QObject::connect(m_boutonSuite, SIGNAL(clicked ()), this, SLOT(passerPeriodeSuivante()));
  16. }
  17. void MainWindow::passerPeriodeSuivante()
  18. {
  19. m_periode++;
  20. emit periodeSuivante();
  21. }


 
Page concernée de mon QTabWidget

Code :
  1. #include "InformationEntreprise.h"
  2. InformationEntreprise::InformationEntreprise(const Entreprise* E, MainWindow* W) : QWidget()
  3. {
  4. m_view=new MyTreeView(E,this,this);
  5. QObject::connect(W, SIGNAL(periodeSuivante()), this, SLOT(passerPeriodeSuivante()));
  6. }
  7. QWidget* InformationEntreprise::getPage3()
  8. {
  9. return m_view;
  10. }
  11. void InformationEntreprise::passerPeriodeSuivante()
  12. {
  13. emit periodeSuivante();
  14. }


 
Page avec le QTreeView

Code :
  1. #include "mytreewidget.h"
  2. MyTreeView::MyTreeView(const Entreprise* E, InformationEntreprise* IE, QWidget * parent) : QTreeView(parent), m_entreprises(E[0].getNombreDEntreprise())
  3. {
  4. for (int i=0; i<25; i++) m_entreprises[i]=E[i];
  5. setModel(m_model);
  6. m_tabwindow= new WidgetTableauEntreprise(E,this);
  7. QObject::connect(IE, SIGNAL(periodeSuivante()), this, SLOT(passerPeriodeSuivante()));
  8. }
  9. void MyTreeView::passerPeriodeSuivante()
  10. {
  11. emit periodeSuivante();
  12. }


 
Fenêtre avec les tableaux:

Code :
  1. #include "MyTableau.h"
  2. MyTableau::MyTableau(int rows, int columns, Entreprise E, QWidget * parent, WidgetTableauEntreprise* WTE) : m_periode(0) //, QTableWidget(rows,columns,parent )
  3. {
  4.      m_E=E;
  5.      m_tableWidget1=new QTableWidget(5, 4, parent);
  6.      m_tableWidget2=new QTableWidget(3, 4, parent); 
  7.      QObject::connect(m_suivant, SIGNAL(clicked()), this, SLOT(passerPeriodeSuivante()));
  8. }
  9. void MyTableau::populateTableWidget1(QTableWidget *tableWidget, Entreprise E)
  10. {
  11.          // Cette méthode rempli le tableau en fonction de la période
  12. }
  13. void MyTableau::populateTableWidget2(QTableWidget *tableWidget, Entreprise E)
  14. {
  15.         // Cette méthode rempli le tableau en fonction de la période
  16. }
  17. void MyTableau::passerPeriodeSuivante()
  18. {
  19. m_periode+=1;
  20. emit periodeSuivante();
  21. populateTableWidget1(m_tableWidget1, m_E);
  22. m_tableWidget1->setGeometry(0,0,500, 300);
  23. populateTableWidget2(m_tableWidget2, m_E);
  24. m_tableWidget2->setGeometry(0,300,500, 300);
  25. }


 
 
Pouvez-m'aider?
 
Merci

Reply

Marsh Posté le 09-05-2008 à 10:57:33   

Reply

Marsh Posté le 13-05-2008 à 16:30:05    

Salut,
 
Active la console pour voir ce que Qt dis; il peut y avoir une faute de frappe quelque part qui te sera rapporté (CONFIG += console dans le pro).
 
Au passage, pas besoin d'un slot pour ne faire qu'émettre un signal, un connect entre 2 signaux est aussi valable ;) Les règles concernant les signatures doivent être respectées bien sûr; par ex:

Code :
  1. connect(IE, SIGNAL(periodeSuivante()), this, SIGNAL(periodeSuivante()))


est tout à fait valable et évite un slot inutile. Et pas besoin de préfixer connect de QObject:: dans les classes dérivant de QObject.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed