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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 ?

  8. #8
    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