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 :

Multi Widget connecté à un bouton


Sujet :

Qt

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut Multi Widget connecté à un bouton
    Bonjour,

    Je cherche à connecter un bouton de ma mainWindow à plusieurs classes héritant de QWidget, cette connexion est différente suivant le Widget affiché.

    Pour prendre un exemple explicite: c'est le bouton "enregistrer" que je veux connecté à mes widgets: Si widget1 est ouvert, je connect le bouton enregistrer au slot1. Si widget2 est ouvert, je connect le bouton enregistrer au slot2.

    Mais voila, si j'ouvre widget1, le connect se fait bien. Et si j'ouvre widget2 alors que widget1 a été ouvert, le programme me retourne une erreur... Le slot d'avant n'est donc pas "déconecté" si je puis dire...

    Avez une méthode à me proposer qui me permettrai de gérer ces connects?
    Merci d'avance.

  2. #2
    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.
    Quel erreur??
    sinon as tu essayé diconnect??
    http://qt.developpez.com/doc/latest/...l#disconnect-2

  3. #3
    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,

    Je ne connaissais pas du tout disconnect, ça pourrait en effet m'aider.
    D'après ce que je lis: disconnect est sencé etre appelé à chaque destruction du QObject, donc a chaque fermeture de mes widgets ?

    L'erreur retourné n'est pas une erreur de make, mais une erreur windows dans l'utilisation du programme (l'habituel "ne pas envoyer").

    étant donné que je peux ouvrir widget1 et widget2 en même temps dans ma mainwindow (ce que j'évitais quand même de faire pour le moment) gérer "isEnable" ou "hasFocus" peut-il m'aider?

  4. #4
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Vaut mieux connecter le signal correspondant à Enregistrer à un slot au niveau de la fenêtre principale. C'est ensuite dans ce slot que tu récupèrerais le doc actif pour transmettre la demande de sauvegarde au document.

  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
    Salut,

    C'est déjà un peu ce que j'avais fais, sans gérer les documents actifs (je n'ouvrais qu'un widget à la fois pour éviter des conflits)

    En gros jusque là (même si ce n'est pas solution définitive) j'ai fais deux slots différents pour mes deux widgets, ces deux slots sont connectés au bouton enregistrer au moment où j'ouvre un des deux widgets.

    Le fait d'ouvrir le widget1 et de le fermer ensuite, devrait bien de disconnect du slot et donc me laisser la connection au slot2 pour le widget2 (si j'ouvre se dernier) s'effectuer normalement ?
    Or dans mon cas: à la fermeture de wighet1, le slot n'est pas déconnecté, si bien que même sans ouvrir widget2, un appuis sur le bouton enregistrer me génère l'erreur windows de base.
    J'ai donc un problème de disconnect à la fermeture de mon widget ?

  6. #6
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    On peut voir le code stp? (en-tête + constructeur + connect + fonction permettant d'ouvrir widget1 par ex)

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    En fait, j'ai peut être une idée du pourquoi je n'ai pas de disconnect; c'est parce que j'ai n'ai pas de connect

    Voici ce qui me permet d'afficher mes deux widgets: comme on peut le voir, l'affichage des widgets ne se fait pas grace à un connect:
    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
    void FenetrePrinc::nouveau()
    {
          bool ok = false;
          QList<QString> choixNouveau;
                choixNouveau.append("Choisir...");
                choixNouveau.append("Fiche Proprietaire");
                choixNouveau.append("Fiche Locataire");
                QString chaine = QInputDialog::getItem(this, "Nouvelle fiche", 
                                                     "Quelle genre de fiche voulez-vous créer ?", 
                                                      choixNouveau,  0, false, &ok);
     
                if (chaine == "Fiche Proprietaire" && ok == true)
                    {ouvrirFichePro();} //Widget 1
                else if (chaine == "Fiche Locataire" && ok == true)
                    {ouvrirFicheLoc();} //Widget 2
                else if (chaine == "Choisir..." && ok == true)
                    {QMessageBox::information(this, "Donnée manquante", 
                     "Veuillez choisir un type de fiche dans la liste proposée");
                    }
    }
     
    void FenetrePrinc::ouvrirFichePro()
    {
         fichepro = new FicheProprietaire();
         database->initNewCodeP(fichepro);
     
         QScrollArea *scrollArea = new QScrollArea;
         scrollArea->setWidget(fichepro);
         mdiArea->addSubWindow(scrollArea);
     
     
         connect(enregistrerAct, SIGNAL(triggered()), this, SLOT(save())); //slot 1
         scrollArea->show();
    }
     
    void FenetrePrinc::ouvrirFicheLoc()
    {
         ficheloc = new FicheLocataire();
         database->initNewCodeO(ficheloc);
     
         QScrollArea *scrollArea = new QScrollArea;
         scrollArea->setWidget(ficheloc);
         mdiArea->addSubWindow(scrollArea);
     
         connect(enregistrerAct, SIGNAL(triggered()), this, SLOT(save2())); //slot2
         scrollArea->show();
    }
    Je suppose qu'il faille que je fasse des connects aussi pour l'ouverture de mes widgets, ainsi, à leur fermeture ça me déconnectera aussi les slot 1 et 2 ?

  8. #8
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Ben dans ce cas le bug vient de save1() et save2()... Tu utilises un pointeur sans vérifié qu'il est valide non?

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    En effet, je ne fais aucune "vérification" (vérifier un pointeur, c'est vérifier qu'il ne pointe pas vers une valeur NULL non?)

    Voici comment sont fais mes slots:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void FenetrePrinc::save()
    {
         SavePropriClass *savingPropri = new SavePropriClass();
         savingPropri->savePropri(fichepro);
    }
     
    void FenetrePrinc::save2()
    {
         SavePropriClass *savingPropri = new SavePropriClass();
         savingPropri->saveLoca(ficheloc);
    }

  10. #10
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    save() plantera si tu n'es pas passé par OuvrirFichePro() avant et situation équivalente pour l'autre slot/formulaire... Donc oui, vérifie que les pointeurs ne sont pas null avant de tenter de les sauver, et encore plus important, assigne les à 0 lors de la construction de FenetrePrinc si ce n'est déjà fait!

  11. #11
    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,

    Les seuls pointeurs qu'il y ai ici sont des pointeurs vers des objets, ils sont donc automatiquement assignés à leurs créations(ce ne sont pas des int ou autres...). il vais donc les créer dans le constructeur de cette façon:
    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
    FenetrePrinc::FenetrePrinc()
    {
         database = new DatabaseClass; //conection à la database.
     
         setWindowTitle(tr("BMG Immo"));
    	 mdiArea = new QMdiArea; //création de l'Area acceuillant les fenetres
         setCentralWidget(mdiArea); //place l'Area crée au centre de la mainWindow
     
     
    	 createActions();
         createMenus();
         createToolBars();
     
    SavePropriClass *savingPropri = new SavePropriClass();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void FenetrePrinc::save()
    {
            savingPropri->savePropri(fichepro);
    }
     
    void FenetrePrinc::save2()
    {
            savingPropri->saveLoca(ficheloc);
    }

    Et du coup, je ne trouve pas comment vérifier qu'un pointeur vers un objet n'est pas à null... Pourrait-on m'indiquer un lien ou c'est expliqué?


    Par ailleurs,
    Je passe automatiquement par les méthodes OuvrirFichePro, OuvrirFicheLoc pour ouvrir une fiche, ce qui me connect le bouton aux save (avant ils ne sont pas connecté: un clic sur le bouton enregistrer ne fais donc rien).
    Par contre en effet: si je ferme une fiche préalablement ouverte, le slot ne semble pas se déconnecter, faut-il que je fasse de ouvrirFichePro et ouvrirFicheLoc des lots pour qu'il y ait des "disconnect" du bouton enregistrer?

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Vaut mieux connecter le signal correspondant à Enregistrer à un slot au niveau de la fenêtre principale. C'est ensuite dans ce slot que tu récupèrerais le doc actif pour transmettre la demande de sauvegarde au document.
    J'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void FenetrePrinc::save3()
    {
         if(fichepro->hasFocus())
           savingPropri->savePropri(fichepro);
         else if(ficheloc->hasFocus())
           savingLoca->saveLoca(ficheloc);
         else
           qDebug() <<"rien à faire";
    }
    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
    FenetrePrinc::FenetrePrinc()
    {
         database = new DatabaseClass();
     
         setWindowTitle(tr("BMG Immo"));
    	 mdiArea = new QMdiArea; //création de l'Area acceuillant les fenetres
         setCentralWidget(mdiArea); //place l'Area crée au centre de le mainWindow
     
         createActions();
         createMenus();
         createToolBars();
    //     updateMenus();
     
         savingPropri = new SaveFiche();
         savingLoca = new SaveFiche();
         connect(enregistrerAct, SIGNAL(triggered()), this, SLOT(save3()));
     
    }
    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 FenetrePrinc::ouvrirFichePro()
    {
         fichepro = new FicheProprietaire();
         database->initNewCodeP(fichepro);
     
         QScrollArea *scrollArea = new QScrollArea;
         scrollArea->setWidget(fichepro);
         mdiArea->addSubWindow(scrollArea);
     
     
    //     connect(enregistrerAct, SIGNAL(triggered()), this, SLOT(save()));
         scrollArea->show();
    }
     
    void FenetrePrinc::ouvrirFicheLoc()
    {
         ficheloc = new FicheLocataire();
         database->initNewCodeO(ficheloc);
     
         QScrollArea *scrollArea = new QScrollArea;
         scrollArea->setWidget(ficheloc);
         mdiArea->addSubWindow(scrollArea);
     
    //     connect(enregistrerAct, SIGNAL(triggered()), this, SLOT(save2()));
         scrollArea->show();
    }
    mais ça ne fonctionne pas (erreur windows à l'exécution dans tous les cas de figure).
    Etant donné que je passe par des QScrollArea et QMdiArea, je ne sais pas si hasFocus() fonctionne correctement ?

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

    Désolé de devoir relancer le sujet.

    J'ai connecté mon bouton enregistrer à un slot au niveau de la mainWindow, comme IrmatDen me l'avait conseillé.

    Je récupère le document actif donc, et le test avec les différents documents que je peux avoir d'ouvert comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void FenetrePrinc::saveAll()
    {
         if(focusWidget() == fichepro)
            savingPropri->savePropri(fichepro);
         else if(focusWidget() == ficheloc)
            savingLoca->saveLoca(ficheloc);
         else if(focusWidget() == ficheimm)
            savingImm->saveImm(ficheimm);
         else if(focusWidget() == fichelot)
            savingLot->saveLot(fichelot);
         else
            qDebug()<< "rien à enregistrer";
    }
    dans tous les cas de figure, je n'ai que le debug qui s'affiche dans la console.

    j'ai initialiser les pointeurs dans mon constructeur par défaut.
    Qu'ai-je pu oublier?

    Merci d'avance.

    EDIT: Problème réglé.

    Voici la solution: passer par tous les contenant avant d'arriver au contenu:
    donc, je passe par QMdiArea, puis QScrollArea comme ceci:

    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
    void FenetrePrinc::saveAll()
    {
         if(QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
            {
                 if(activeSubWindow->widget() == scrollArea)
                 {
                     if(scrollArea->widget() == fichepro)
                     {
                         saving->savePropri(fichepro);
                     }
                     else if(scrollArea->widget() == ficheloc)
                     {
                         saving->saveLoca(ficheloc);
                     }  
                     else if(scrollArea->widget() == ficheimm)
                     {
                          saving->saveImm(ficheimm);
                     }
                     else if(scrollArea->widget() == fichelot)
                     {
                          saving->saveLot(fichelot);
                     }
                     else
                       qDebug()<< "fonction saveAll() pose probleme";
                 }
                 else
                    qDebug()<< "fonction saveAll() pose probleme";
            }
         else
            qDebug()<< "Aucune fiche a enregistrer";
    }
    Puisque je crée mes fiche de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void FenetrePrinc::ouvrirFichePro()
    {
         fichepro = new FicheProprietaire();
         database->initNewCodeP(fichepro);
     
         scrollArea = new QScrollArea;
         scrollArea->setWidget(fichepro);
         mdiArea->addSubWindow(scrollArea);
     
         scrollArea->show();
    }
    Merci pour votre aide.

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

Discussions similaires

  1. Résistance pour connecter un bouton
    Par Dev 37C dans le forum Arduino
    Réponses: 2
    Dernier message: 15/04/2015, 13h44
  2. Widget simple et bouton
    Par frmaniako dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 27/02/2012, 11h13
  3. Réponses: 6
    Dernier message: 23/09/2011, 10h13
  4. [WD12] Creation d'un skin multi etat pour un bouton
    Par yann_72 dans le forum WinDev
    Réponses: 1
    Dernier message: 16/12/2008, 21h37
  5. Réponses: 3
    Dernier message: 03/03/2006, 17h09

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