QT3 et classes (débutant)

QT3 et classes (débutant) - C++ - Programmation

Marsh Posté le 06-01-2006 à 09:25:04    

Bonjour,
 
J'ai 3 classes :
 

Code :
  1. #ifndef APPLICATION_H
  2. #define APPLICATION_H
  3. #include <qmainwindow.h>
  4. #include "listview.h"
  5. #include "menus.h"
  6. #include "rename.h"
  7. #include "application.h"
  8. class QTextEdit;
  9. class ButtonsGroups;
  10. class ListView;
  11. class Rename;
  12. class ApplicationWindow: public QMainWindow
  13. {
  14.     Q_OBJECT
  15. public:
  16.     ApplicationWindow();
  17.     ~ApplicationWindow();
  18. Menus *menus_dlg;
  19.     ListView *bg;
  20. protected:
  21.     void closeEvent( QCloseEvent* );
  22. //    QPoint qp;
  23.    
  24. private slots:
  25.     void newDoc();
  26.     void choose();
  27.     void load( const QString &fileName );
  28.     void save();
  29.     void saveAs();
  30.     void print();
  31.   void menus();
  32.     void about();
  33.     void aboutQt();
  34. private:
  35. //    QPrinter *printer;
  36. //    QString filename;
  37. //    ListView *bg;
  38. };
  39. #endif


 

Code :
  1. #ifndef LISTVIEW_H
  2. #define LISTVIEW_H
  3. #include <qwidget.h>
  4. #include <qlistview.h>
  5. #include <qpushbutton.h>
  6. #include <qlineedit.h>
  7. #include <qcombobox.h>
  8. #include "listview.h"
  9. //#include "menus.h"
  10. #include "rename.h"
  11. //#include "application.h"
  12. class QListView;
  13. class Rename;
  14. class ListView : public QWidget
  15. {
  16.     Q_OBJECT
  17. public:
  18.     ListView( QWidget *parent = 0, const char *name = 0 );
  19.     void savePanier();
  20.     void saveArticles();
  21.     void getChangedText( QListViewItem * , const int, const QString& );
  22.     void saveChangedText();
  23.     void setSavedData( QListViewItem *, const int );
  24.     void changeText();
  25.     QString getArticleText(QListViewItem *, int);
  26.     void toListView();
  27.             Rename *rename_dlg;
  28. private:
  29.     QLineEdit      *searchArticlesLine;
  30.    
  31.     QComboBox      *categoryComboBox;
  32.    
  33.     QPushButton    *searchButton;
  34.     QPushButton    *addButton;
  35.     QPushButton    *delButton;
  36.     QPushButton    *addLabelButton;
  37.     QPushButton    *delLabelButton;
  38.     QPushButton    *reloadButton;
  39.    
  40.     QListView      *articles;
  41.     QListView      *panier;
  42.     QListViewItem  *root;
  43.     QListViewItem  *root2;
  44.     QListViewItem  *article;
  45.     QListViewItem  *saved_article;
  46.    
  47.     int            saved_col;
  48.    
  49.     char           hc;
  50.     std::string    fpanier;
  51.     std::string    farticles;
  52.     bool           selection;
  53.      
  54.     void loadArticles();
  55.     void clearArticles();
  56.     void loadPanier();
  57.     void clearPanier();
  58.     QListViewItem* exists_panier(const QString& );
  59.     QListViewItem* exists_articles(const QString& );
  60.    
  61. public slots:
  62.     void      keyPressEvent( QKeyEvent * );
  63. protected slots:   
  64.     void searchArticles();
  65.     void addLabel();
  66.     void editLabel(const int);
  67.     void editQuantity();
  68.     void editUnit();
  69.     void delLabel();
  70.     void editQuantityPanier();
  71.     void reloadCombo();
  72.     void slotLeft2Right();
  73.     void slotRemoveRight();
  74. };
  75. #endif


 

Code :
  1. #ifndef RENAME_H
  2. #define RENAME_H
  3. #include <qdialog.h>
  4. #include <qpushbutton.h>
  5. #include <qlineedit.h>
  6. #include "rename.h"
  7. //#include "listview.h"
  8. //#include "menus.h"
  9. //#include "application.h"
  10. class QLabel;
  11. //class QLineEdit;
  12. //class QPushButton;
  13. class ListView;
  14. class ApplicationWindow;
  15. class Rename : public QDialog
  16. {
  17.     Q_OBJECT
  18. public:
  19.   Rename( QWidget *parent=0, const char *name=0 );
  20.   QString getRenameText();
  21.   void setLineEditText(QString);
  22. //  void getArticleText( QListViewItem *);
  23.    
  24. private slots:
  25.     void okClicked();
  26.    
  27. private:
  28.     QLabel *label;
  29.     QPushButton *okButton;
  30.     QPushButton *cancelButton;
  31.     QLineEdit *lineEdit;
  32. };
  33. #endif


 
et dans le code :
void Rename::okClicked()
{
  ApplicationWindow::bg->ListView->saveChangedText();
  close();
}
 
j'ai l'erreur de compil :
23 C:\root\Dev-Cpp\qt-3\My Examples QT3\listview\application.h  
  object missing in reference to `ApplicationWindow::bg'  
47 C:\root\Dev-Cpp\qt-3\My Examples QT3\listview\rename.cpp  
  from this location  
 
Je m'en sors pas.
Merci si vous pouvez m'aider

Reply

Marsh Posté le 06-01-2006 à 09:25:04   

Reply

Marsh Posté le 06-01-2006 à 09:41:08    

Ben oui, bg n'est pas static donc ton écriture ApplicationWindow::bg est fausse. Il te faut une instance de ApplicationWindow quelque part:

Code :
  1. ApplicationWindow *app = ...:
  2. app->bg->ListView->saveChangedText();


Tu peux le passer au constructeur de Rename par exemple. Mais ton design a l'air bancal quand même.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-01-2006 à 09:59:42    

Mais j' ai aussi :
<cpp>
#include <qapplication.h>
 
#include "application.h"
#include "listview.h"
 
int main( int argc, char ** argv ) {
 
    QApplication a( argc, argv );
    ApplicationWindow *mw = new ApplicationWindow();
    mw->setCaption( "Easy Courses" );
    mw->show();
    a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
    return a.exec();
 
}
</cpp>
 
et mw->bg->ListView->SaveChangedText();
 
donne comme erreur :
47 C:\root\Dev-Cpp\qt-3\My Examples QT3\listview\rename.cpp `mw' undeclared (first use this function)  
 
pour ce qui est bancale, je suis d'accord.

Reply

Marsh Posté le 06-01-2006 à 10:16:09    

Où est créé Rename ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-01-2006 à 10:20:01    

Rename est créé quand on presse F1 dans ListView:
 
      rename_dlg = new Rename( this );
      s = article->text( col );
      rename_dlg->setLineEditText( ListView::getArticleText( article, col ));
      rename_dlg->resize( 200, 100 );
      rename_dlg->show();
      rename_dlg->raise();
      rename_dlg->setActiveWindow();
      rename_dlg->move( 100, 100 );
      ListView::setSavedData( article, col );
      ListView::saveChangedText();

Reply

Marsh Posté le 06-01-2006 à 10:28:42    

Et je suppose que rename sert à entrer un nouveau nom ?
Je te propose de transformer Rename en boite de dialogue modale (= on ne peut pas toucher à ListView tant que Rename n'est pas fermée):
Pour cela, appelle exec() au lieu de show().
Ton design est bancal parce que Rename = une fenêtre enfant modifie ListView = une fenêtre parent.
Une fenêtre enfant ne devrait pas toucher à son parent. Au lieu de ça, c'est ListView qui va s'auto-modifier quand Rename est fermée. Ca simplifie tout:

Code :
  1. // pas besoin d'alloc dynamique
  2.       Rename rename_dlg( this );
  3.       s = article->text( col );
  4.       rename_dlg.setLineEditText( this->getArticleText( article, col ));
  5.       rename_dlg.resize( 200, 100 );
  6.       if ( rename_dlg.exec() == QDialog::Accepted )
  7.       {
  8.         // si j'ai bien compris
  9.         this->setSavedData( article, col );
  10.         this->saveChangedText();
  11.       }


et Rename::OkClicked() n'a plus lieu d'exister (simplement connecter ne signal bouton ok cliquer au slot accept(), et le bouton annuler au slot reject.
accept() fait renvoyer QDialog::Accepted à exec(), et reject fait renvoyer QDialog::Rejected...
 
PS: oublie la notation ListView:: ApplicationWindow:: etc... les fonctions doivent être appelée sur des instances.


Message édité par HelloWorld le 06-01-2006 à 10:30:46

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-01-2006 à 10:50:02    

Oui, maintenant ca compile, mais comment recuperer la valeur du text edit rename_dlg ?
  str = rename_dlg->getRenameText();
ne renvoie pas la nouvelle valeur

Reply

Marsh Posté le 06-01-2006 à 13:43:41    

Ah ben faut voir ton code de getRenameText();
Mais normalement ton champ text est déclaré public, donc pas besoin de créer une fonction.
C'est quoi le code de getRenameText ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-01-2006 à 14:26:10    

QString Rename::getRenameText()
{
  return lineEdit->text();
}

Reply

Marsh Posté le 06-01-2006 à 16:53:21    

Tu l'appelles quand ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-01-2006 à 16:53:21   

Reply

Marsh Posté le 06-01-2006 à 16:56:55    

Comme t'as dit mais je dois faire faux qq part :
     Rename rename_dlg( this );
     s = article->text( col );
     rename_dlg.setLineEditText( this->getArticleText( article, col ));
     rename_dlg.resize( 200, 100 );
 
     if ( rename_dlg.exec() == QDialog::Accepted )
     {
       // si j'ai bien compris
       QString s;
       s = Rename::rename_dlg->getRenameText();
       ListView::article->setText(col, s);
     }  
     return;

Reply

Marsh Posté le 06-01-2006 à 17:48:54    

Ca m'étonne, il me semblait que ça aurait du marcher.
Redéfinit accept() dans Rename (virtual void accept ()) et sauvegarde lineEdit->text(); à ce moment. Puis dans getRenameText tu renvois la sauvegarde.

Code :
  1. void Rename::accept ()
  2. {
  3.     this->renameText = this->lineEdit->text();
  4.     QDialog::accept();
  5. }
  6. QString Rename::getRenameText()
  7. {
  8.     return this->renameText;
  9. }


 
PS: Rename:: devant rename_dlg et ListView:: devant article ne servent toujours à rien. Je me demande même comment ça compile.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-01-2006 à 17:54:26    

Je fais remonter le topic pour remercier HelloWorld qui m'a bien aide a resoudre mon probleme. merci donc

Reply

Sujets relatifs:

Leave a Replay

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