QT3 et classes (débutant) - C++ - Programmation
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 : 
 | 
 
Tu peux le passer au constructeur de Rename par exemple. Mais ton design a l'air bancal quand même.
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.
Marsh Posté le 06-01-2006 à 10:16:09
ReplyMarsh 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(); 
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 : 
 | 
 
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.
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
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 ?
Marsh Posté le 06-01-2006 à 14:26:10
QString Rename::getRenameText() 
{ 
  return lineEdit->text(); 
}
Marsh Posté le 06-01-2006 à 16:53:21
ReplyMarsh 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; 
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 : 
 | 
 
 
PS: Rename:: devant rename_dlg et ListView:: devant article ne servent toujours à rien. Je me demande même comment ça compile.
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
Marsh Posté le 06-01-2006 à 09:25:04
Bonjour,
J'ai 3 classes :
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