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

Discussion :

Signal et slot entre deux projets

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut Signal et slot entre deux projets
    Bonjour,
    je ne sais pas comment corriger mon problème.
    J'ai un projet contenant deux classes, chacune d'elles comportant les fichiers .cpp, .h et un formulaire .ui.

    Avec ma première classe, intitulée "apGe", j'ai fait une fenêtre QWidget (apge.ui) qui comporte des boutons et notamment "btnArSys" ("Arrêter système") qui, lorsque je clique dessus, m'ouvre une seconde fenêtre QDialog (dialogas.ui). Celle-ci me demande la confirmation "Voulez-vous vraiment arrêter le système ?" et j'ai le choix entre deux boutons QDialogButtonBox "OK" ou "annuler".

    Je voudrais simplement que lorsque je clique sur OK, mes 2 fenêtres (apge.ui ET dialogas.ui) se ferment définitivement. Comment faire cela ?


    N'hésitez pas, tout conseil et information m'intéresseront, je suis là pour apprendre.
    Merci par avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Par défaut
    Tu peux utiliser une QMessageBox pour demander une confirmation à l'utilisateur. Dans le slot appelé lors du clic sur le bouton btnArSys, tu peux faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MainWindow::onBtnSysArClicked() 
    {
        const int reponse = QMessageBox::question(this, "Extinction", "Souhaitez vous réellement éteindre le système", QMessageBox ::Yes | QMessageBox::No);
     
        if (reponse == QMessageBox::Yes) {
            // On appelle la fonction qui éteind le système.
            shutdown();
        }
     
        // Si l'utilisateur a cliqué sur "Non", alors il ne se passe rien.
    }

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut
    Salut, et merci pour ta proposition.
    J'ai bien essayé d'intégrer ta réponse dans mon code mais j'ai dû faire une erreur ou oublier quelque chose quelque part, ça ne menait pas à un résultat satisfaisant.
    J'ai ensuite tenté autre chose, sur la proposition de quelqu'un :
    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
    #include "dialogas.h"
    #include "apge.h"
     
     
    DialogAS::DialogAS(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::DialogAS)
    {
        ui->setupUi(this);
    }
     
    DialogAS::~DialogAS()
    {
        delete ui;
    }
     
    void DialogAS::on_btnArSys_accepted()
    {
        DialogAS* dialarsys = new DialogAS(this);
        QApplication::exit();
    }
     
    void DialogAS::on_btnArSys_rejected()
    {
        DialogAS* dialarsys = new DialogAS(this);
        dialarsys->close();
    }
    Là tout fonctionne et fait ce que j'attendais. Mais je reste intéressé par ta solution pour au moins saisir ce que je n'ai pas su faire, peux-tu me la présenter ou me la ré-expliquer en fonction du résultat que j'ai pu obtenir avec la seconde solution stp ?
    Merci beaucoup par avance.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Toto ZEHERO Voir le message
    J'ai bien essayé d'intégrer ta réponse dans mon code [...]
    ça ne menait pas à un résultat satisfaisant.
    Pourrait-on voir ce que tu as essayé de faire ? Ce qui n'était pas satisfaisant ?
    Et qu'est-ce que tu n'as pas compris précisément dans sa solution ?
    Citation Envoyé par Toto ZEHERO Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void DialogAS::on_btnArSys_accepted()
    {
        DialogAS* dialarsys = new DialogAS(this);
        QApplication::exit();
    }
     
    void DialogAS::on_btnArSys_rejected()
    {
        DialogAS* dialarsys = new DialogAS(this);
        dialarsys->close();
    }
    Pourquoi créer un nouveau dialogue une fois accepté ou refusé ?!

    L'exécution normale d'un QDialog doit se faire au moyen de sa méthode exec() qui va retourner soit QDialog::Accepted soit QDialog::Rejected ;
    Un simple if/else sur ce retour permet d'agir en conséquence.

    Pour ce qui est de sa durée de vie, ne fais pas de new, mais un simple DialogAS dialarsys;. Il se détruira de lui-même à la fin de la fonction qui l'appelle.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut
    Bonjour,
    dans la mesure où j'ai modifié mon code, je ne peux pas retrouver mes différents essais mais je devais être fatigué, j'avais fait apparemment n'importe quoi mais sûrement pas ce que me disait Arnold.. (j'avais 4 ou 5 messages dans "1. Problèmes").
    Dans tous les cas, j'ai réessayé à tête reposée et effectivement, j'arrive à produire ce que je voulais. Donc, déjà, à nouveau un grand MERCI à Arnold (si tu lis ce message ! ).


    Pour répondre à ta question Jérôme (créer un nouveau dialogue une fois accepté ou refusé ?!), je pensais devoir instancier ma classe à chaque cas de figure, afin de lui attribuer une action (je ne voyais pas comment lui donner d'ordre autrement). J'ai changé mon code mais si je l'avais conservé, j'aurais dû le formuler tout simplement 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include"dialogas.h"
    #include"ui_dialogas.h"
    #include"apge.h"
    #include"ui_apge.h"
    
    
    DialogAS::DialogAS(QWidget*parent):
    
    QDialog(parent), ui(newUi::DialogAS)
    {
    ui->setupUi(this);
    } DialogAS::~DialogAS() {
    delete ui;
    } voidDialogAS::on_btnArSys_accepted() {
    QApplication::exit();
    }
    voidDialogAS::on_btnArSys_rejected() {
    DialogAS*dialarsys; dialarsys->close();
    }

    Enfin, pour bien comprendre ce que je fais (je découvre Qt depuis environ 2 semaines et le C++ depuis environ 3..), la méthode exec() de QDialog, ou ici QMessageBox, n'apparaît pas clairement dans mon code, mais elle se lance "en arrière-plan" lorsque j'exécute l'exec() de mon application principale, c'est bien ça ?
    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <QtGui>
    #include "appli.h"
    #include <QApplication>
     
    int main (int argc, char* argv[])
    {
        QApplication app (argc, argv);
        appli fenetre;
        fenetre.show();
        return app.exec();
    }

    appli.cpp :
    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
    #include "appli.h"
    #include "ui_appli.h"
     
    appli::appli(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::appli)
    {
        ui->setupUi(this);
    }
     
    appli::~appli()
    {
        delete ui;
    }
     
    void appli::on_btnArSys_clicked()
    {
        const int reponse = QMessageBox::question(this, "ATTENTION !!", "Souhaitez vous VRAIMENT éteindre le système ?", QMessageBox ::Ok | QMessageBox::Cancel);
            if (reponse == QMessageBox::Ok) {
                // On appelle la fonction qui éteind le système.
                appli::destroy();
            }
     
            // Si l'utilisateur a cliqué sur "Non", alors il ne se passe rien.
    }

Discussions similaires

  1. Réponses: 11
    Dernier message: 30/05/2011, 16h13
  2. Architecture et communication entre deux projets
    Par Patoche_c dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/10/2009, 16h16
  3. Dépendance entre deux projets
    Par Nalfeim dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 03/03/2009, 10h08
  4. Communication entre deux projets Web
    Par midoENSI dans le forum Struts 1
    Réponses: 5
    Dernier message: 08/06/2007, 00h33
  5. Réponses: 3
    Dernier message: 05/07/2006, 11h59

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