IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Réinitialiser les champs d'un QDialog


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de anakronox
    Inscrit en
    Novembre 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 49
    Par défaut Réinitialiser les champs d'un QDialog
    Bonjour à tous. J'ai crée une classe qui hérite de QDialog, dans laquelle j'ai positionné des QLineEdit. Par exemple, la fenetre affiche un champ id, nom, type... Le champ id (qui est un QLineEdit en ReadOnly) est rempli automatiquement par la fonction generateId :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    inline int generateId(const QString &table)
    {
        QSqlQuery query;
        int id = 0;
        query.exec("SELECT MAX(idOrdi) FROM " + table);
     
        if(query.next())
            id = query.value(0).toInt() + 1;
     
           return id;
    }
    Tout fonctionne normalement: c'est-à-dire que je peux creer un nouvel enregistrement. Mais le probleme c'est que lorsque je ré-ouvre la fenetre (de type QDialog) les champs du QLineEdit m'affichent à nouveau les données de l'enregistrement précédent ( y compris l'id). Or je voudrais réinitialiser tous les champs de saisies , sauf l'id pour lequel je veux afficher l'id du precedent enregistrement + 1 (ce qu'est censé faire la fonction generateId).
    Je tiens à préciser que le nouvel id s'affiche mais seulement après fermeture puis ré-ouverture du programme.
    Aussi je ne pense pas que mon probleme concerne les SGBD, donc je poste dans cette section (en espérant ne pas me tromper).
    Merci d'avance pour votre aide.

    Edit: Voici le code de la fiche en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    OrdiAjout::OrdiAjout(QSqlTableModel *Model ) : QDialog()
    {
        model = Model;
     
        //Les lignes de saisies
        id = new QLineEdit;
        nom = new QLineEdit;
        type = new QLineEdit;
        num = new QLineEdit;
        d_achat = new QLineEdit;
        d_service = new QLineEdit;
        d_reforme = new QLineEdit;
        processeur = new QLineEdit;
        memoire = new QLineEdit;
        type_memoire = new QLineEdit;
        adr_ip = new QLineEdit;
        adr_mac = new QLineEdit;
     
        QVariant idd = generateId("ORDI");
        id->setText(idd.toString());
        //Line Edit en lecture seule
        id->setReadOnly(1);
     
        //Les masques de saisies 
        d_achat->setInputMask("00/00/0000");
        d_service->setInputMask("00/00/0000");
        d_reforme->setInputMask("00/00/0000");
        adr_ip->setInputMask("000.000.000.000");
        adr_mac->setInputMask("000.000.000.000");
     
        //Le Layout formulaire dans lequel seront les zones de saisies
        QFormLayout *formLayout = new QFormLayout;
     
        //Ajout dans le layout
        formLayout->addRow("Id :", id);
        formLayout->addRow("Nom :", nom);
        formLayout->addRow("Type :", type);
        formLayout->addRow("N° de serie :", num);
        formLayout->addRow("Date achat :", d_achat);
        formLayout->addRow("Date de Mise en service :", d_service);
        formLayout->addRow("Date de reforme :", d_reforme);
        formLayout->addRow("Processeur :", processeur);
        formLayout->addRow("Memoire :", memoire);
        formLayout->addRow("Type memoire :", type_memoire);
        formLayout->addRow("@ IP:", adr_ip);
        formLayout->addRow("@ MAC:", adr_mac);
        formLayout->addRow("Id garantie:", id_Garantie);
        formLayout->addRow("Id marque:", id_Marque);
     
     
        QPushButton *valider = new QPushButton("Valider");
        QPushButton *fermer = new QPushButton("Fermer");
     
        //Creation d'un layout principal (vertical)
        QVBoxLayout *layoutPrincipal = new QVBoxLayout;
     
        //Ajout du layout formulaire dans le layout principale
        layoutPrincipal->addLayout(formLayout);
     
        QWidget::connect(valider, SIGNAL(clicked()), this, SLOT(ajouter()));
        QWidget::connect(valider, SIGNAL(clicked()), this, SLOT(close()));
        //QWidget::connect(valider, SIGNAL(clicked()), this, SLOT(suppr()));
        QWidget::connect(fermer, SIGNAL(clicked()), this, SLOT(close()));
        layoutPrincipal->addWidget(valider); // Ajout du bouton
        layoutPrincipal->addWidget(fermer); // Ajout du bouton
     
        setLayout(layoutPrincipal);
    }
    Et le private SLOT ajouter():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void OrdiAjout::ajouter()
    {
        QSqlQuery Query;
        Query.prepare("INSERT INTO ORDI(IdOrdi, NomOrdi, TypeOrdi, NumSerieOrdi, DateAchatOrdi, DateMiseService,"
        "DateReforme, Processeur, Memoire, TypeMemoire, AdrIp, AdrMac)"
        "VALUES(:id, :nom, :type, :num, :d_achat, :d_service, :d_reforme, :processeur, :memoire, :type_memoire, :adr_ip, :adr_mac)");
     
     
     
        Query.bindValue(":id", id->text());
        Query.bindValue(":nom", nom->text());
        Query.bindValue(":type", type->text());
        Query.bindValue(":num", num->text());
        Query.bindValue(":d_achat", d_achat->text());
        Query.bindValue(":d_service", d_service->text());
        Query.bindValue(":d_reforme", d_reforme->text());
        Query.bindValue(":processeur", processeur->text());
        Query.bindValue(":memoire", memoire->text());
        Query.bindValue(":type_memoire", type_memoire->text());
        Query.bindValue(":adr_ip", adr_ip->text());
        Query.bindValue(":adr_mac", adr_mac->text());
     
        Query.exec();
        model->select();
    }

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Salut,

    Juste une petite question, c'est toujours pour ton application client/serveur ? (que tu décris dans le sous-forum SGBD de Qt).

    Si oui, et que ton application peut accueillir plusieurs utilisateurs en même temps, la méthode "récupérer ID max dans la base + 1" n'est pas une bonne méthode.

    imagine le conflit :
    utilisateur 1 ouvre ton QDialog, il récupère idOrdi = 10+1, il fait ses petites modifs, et pendant ce temps là, utilisateur 2 ouvre ton QDialog et récupère lui aussi idOrdi = 10+1. Ensuite, utilisateur 1 va enregistrer ses données, et plus tard, utilisateurs 2 enregistrera les siennes, ce qui supprimera les données de Utilisateur 1.

    J'avais vu un tuto à l'époque, expliquant la démarche à suivre dans le cas d'une appli de ce genre. Je sais plus si c'était ou non sur Developpez
    Voila, je sais pas si tu avais pensé à la question auparavant.

    Pour ton code, je vois pas trop pourquoi il va chercher les données tout seul dans la base, mais c'est peut être en rapport avec ton objet QSqlTableModel (que je ne connais pas)...

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Comment utilise tu ta Dialog?
    Es ce que tu execute exec?
    peut montrer le bout de code ou tu l'utilise?

  4. #4
    Membre averti Avatar de anakronox
    Inscrit en
    Novembre 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 49
    Par défaut
    Merci pour vos réponses.
    Oui Somato c'est toujours pour mon application client/serveur. Mais la version du programme client ne permettra pas d'éditer les enregistrements (elle permet juste de voir les enregistrements).
    Mongaulois : oui j'utilise exec() pour ouvrir l'objet de type QDialog (définit par la classe OrdiAjout dans un fichier OrdiAjout.cpp) à partir d'une fenêtre (définit dans FenOrdi.cpp).
    Voici le code pour ouvrir le Dialog à partir de FenOrdi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         //Declaration d'une nouvelle fenetre "OrdiAjout"
         FenAjoutOrdi = new OrdiAjout(model);
     
         connect(submitButton, SIGNAL(clicked()), this, SLOT(submit()));
         //connect(nouveauButton, SIGNAL(clicked()), this, SLOT(nouveau()));
     
         //Connection de la fenetre au bouton Nouveau. exec() permet de mettre la fenetre en focus
         connect(nouveauButton, SIGNAL(clicked()), FenAjoutOrdi, SLOT(exec()));

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Ton objet OrdiAjout il est déclaré où ?

    Attention je dis peut être des betises (c'est à prendre avec des pincettes)

    exec(), comme show(), se contente d'afficher ton widget() et lorsque tu clics sur la croix (pour fermer ta page), il le rends invisible (équivalent de setVisible), il ne crée rien ni ne supprime rien.

    Préfère donc peut être ce code-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MaClass::MaClass()
    {
         connect(nouveauButton, SIGNAL(clicked()), FenAjoutOrdi, SLOT(mySlotExec()));
    }
     
     
    void MaClass::mySlotExec()
    {
          OrdiAjout *fenetre = new OrdiAjout(this);
          fenetre->exec();
    }
    J'espère que je t'oriente bien vers la bonne voie.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    +1 pour la méthode de somato sauf qu'il ne sert à rien de faire un new. Surtout qu'ici cela fera de la mémoire inutile qui sera désalloué uniquement lorsque MaClass sera détruite. Ou il aut ajouter un delete.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MaClass::MaClass()
    {
         connect(nouveauButton, SIGNAL(clicked()), FenAjoutOrdi, SLOT(mySlotExec()));
    }
     
     
    void MaClass::mySlotExec()
    {
          OrdiAjout fenetre(this);
          fenetre.exec();
        /*traitement après fermeture*/
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MaClass::MaClass()
    {
         connect(nouveauButton, SIGNAL(clicked()), FenAjoutOrdi, SLOT(mySlotExec()));
    }
     
     
    void MaClass::mySlotExec()
    {
          OrdiAjout *fenetre = new OrdiAjout(this);
          fenetre->exec();
          /*traitement après fermeture*/
       delete fenetre;
    }
    Si tu as tes raison de créé ta dialog au constructeur, il te faut ajouter une methode qui l'initialisera

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MaClass::MaClass()
    {
         connect(nouveauButton, SIGNAL(clicked()), FenAjoutOrdi, SLOT(mySlotExec()));
    }
     
     
    void MaClass::mySlotExec()
    {
         fenetre->initValues();
         fenetre->exec();
          /*traitement après fermeture*/
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment réinitialiser les champs apres submit
    Par ouldfella dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2012, 11h50
  2. Réponses: 5
    Dernier message: 08/06/2011, 14h55
  3. Réinitialiser les champs d'un formulaire
    Par caro_caro dans le forum Wicket
    Réponses: 3
    Dernier message: 06/05/2009, 14h42
  4. [Débutant] Alert sans réinitialiser les champs
    Par kahya dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/03/2007, 11h50
  5. [VBA] Réinitialiser les champs d'un formulaire
    Par kirgan dans le forum Access
    Réponses: 3
    Dernier message: 30/05/2006, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo