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 :

Problème de fermeture de l'application


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut Problème de fermeture de l'application
    Bonjour,

    J'ai un problème avec la fermeture et la connexion entre met deux fenêtres...

    Voilà j'ai une fenêtre principale, qui va ouvrir un sous fenêtre QDialog.

    Donc ce qui devrait normalement ce faire c'est :
    Lancement de ma fenêtre principale => clic sur un bouton, ouvre la seconde fenêtre.
    Si je quitte la première fenêtre logiquement le programme se ferme entièrement même si les sous fenêtre sont encore ouverte.

    Si je clique sur la croix du ma fenêtre secondaire là ça marche, la fenêtre se ferme mais si je clique sur la croix de la fenêtre principale la par contre ça ferme la fenêtre mais pas vraiment... L'application reste dans le gestionnaire de tache... donc en temps que processus...

    Voilà je cherche donc pourquoi j'ai cette erreur mais je vois pas...

    listeur.cpp (fenêtre principale)
    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
     
    #include "listeur.h"
     
    FenListeur::FenListeur(QMainWindow *parent) : QMainWindow(parent)
    {
        setupUi(this);
        setFixedSize(504,306);
        setWindowTitle(NOMLOGICIEL);
     
        Button_infos->setText("Infos");
     
        connect(Button_infos, SIGNAL(clicked()), this, SLOT(infos_film()));
    }
     
    void FenListeur::infos_film()
    {
        FenInfos *fenInfos = new FenInfos(comboBox_film->model(), comboBox_film->currentIndex(), 0);
        fenInfos->setAttribute(Qt::WA_DeleteOnClose);
        fenInfos->show();
    }
    listeur.h
    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
     
    #ifndef LISTEUR_H
    #define LISTEUR_H
     
    #include <QPlastiqueStyle>
    #include <QSharedMemory>
    #include <QDesktopServices>
    #include <QFileDialog>
    #include <QDirIterator>
    #include <QDebug>
     
    #include "ui_listeur.h"
    #include "constante.h"
    #include "infos_film.h"
     
    namespace Ui
    {
        class FenListeur;
    }
     
    class FenListeur : public QMainWindow, private Ui::FenListeur
    {
        Q_OBJECT
     
        public:
            FenListeur(QMainWindow *parent = 0);
     
        private slots:
            void infos_film();
    };
     
    #endif // LISTEUR_H
    infos_film.cpp (fenêtre secondaire)
    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
     
    #include "infos_film.h"
     
    FenInfos::FenInfos(QAbstractItemModel *model, int currentIndex, QWidget *parent) : QDialog(parent), mapper(new QDataWidgetMapper(this))
    {
        QVBoxLayout *layout = new QVBoxLayout();
        QLabel *label_titre = new QLabel("Chargement en cours...");
        layout->addWidget(label_titre);
        setLayout(layout);
     
        mapper->setModel(model);
        mapper->setCurrentIndex(currentIndex);
     
        telechargement("avatar");
    }
     
    void FenInfos::affichage(const QList<QString> &infos)
    {
        if(infos.isEmpty())
        {
            QMessageBox::information(this, "Erreur !", "Aucun film n'a été sélectionné, aucun résumé possible !");
        }
     
        QVBoxLayout *layout = new QVBoxLayout();
     
        QLabel *label_image = new QLabel(this);
        label_image->setPixmap(QPixmap("image_film.jpg"));
        layout->addWidget(label_image);
     
        QLabel *label_titre = new QLabel(infos[0]);
        layout->addWidget(label_titre);
     
        QLabel *label_date_sortie = new QLabel(infos[1]);
        layout->addWidget(label_date_sortie);
     
        QLabel *label_realise_par = new QLabel(infos[2]);
        layout->addWidget(label_realise_par);
     
        QLabel *label_titre_original = new QLabel(infos[3]);
        layout->addWidget(label_titre_original);
     
        QLabel *label_genre = new QLabel(infos[4]);
        layout->addWidget(label_genre);
     
        QLabel *label_duree = new QLabel(infos[5]);
        layout->addWidget(label_duree);
     
        QLabel *label_annee_production = new QLabel(infos[6]);
        layout->addWidget(label_annee_production);
     
        QLabel *label_distributeur = new QLabel(infos[7]);
        layout->addWidget(label_distributeur);
     
        QTextBrowser *textbrowser_synopsis = new QTextBrowser;
        textbrowser_synopsis->setHtml(infos[8]);
        layout->addWidget(textbrowser_synopsis);
     
        setLayout(layout);
    }
    infos_film.h
    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
     
    #ifndef INFOS_FILM_H
    #define INFOS_FILM_H
     
    #include <QVBoxLayout>
    #include <QLabel>
    #include <QTextBrowser>
    #include <QNetworkReply>
    #include <QXmlStreamReader>
    #include <QMessageBox>
    #include <QProgressBar>
    #include <QDataWidgetMapper>
     
    class FenInfos : public QDialog
    {
        Q_OBJECT
     
        public:
            FenInfos(QAbstractItemModel *model, int currentIndex, QWidget *parent = 0);
            QProgressBar *progressBar;
     
        private:
            QDataWidgetMapper *mapper;
     
        private slots:
            void affichage(const QList<QString> &infos);
    };
     
    #endif // INFOS_FILM_H
    PS : Je dois mal le faire mais j'aurais aussi aimé faire en sorte de créer un petit QLabel avec dedans "Chargement en cours..." et dès qu'on arrive au slot affichage, on affiche le vrai contenu de la fenêtre mais, j'ai pas le contenu de la fenêtre j'ai du début à la fin la QLabel "Chargement en cours..." sans jamais voir le contenu graphique du slot affichage

    Merci et bonne journée

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 65
    Points
    65
    Par défaut
    Je pense que la solution est :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FenInfos *fenInfos = new FenInfos(comboBox_film->model(), comboBox_film->currentIndex(), this);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Non ça change rien... :s

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    En principe qt ferme l'appli une fois toutse les fenêtres fermées.
    Si tout est fermé mais que le process non, y as un problème.
    • Quelle version de Qt utilise tu?
    • As tu des threads?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    J'utilise la dernière version de Qt soit la 4.6 et non je n'utilise pas de threads

    Mais de toute façon il y a un souci vu que normalement quand on quitte la fenêtre principale toute le programme se ferme et la non...

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par austin.fla Voir le message
    Mais de toute façon il y a un souci vu que normalement quand on quitte la fenêtre principale toute le programme se ferme et la non...
    ca c'est normale.
    En principe qt ferme l'appli une fois toutes les fenêtres fermées.
    EN plus il n'y as pas de notion de fenêtre principale/secondaire.

    Si tu veut forcer la fermeture, tu peut utilise QApplication::exit();
    http://qt.developpez.com/doc/latest/...lication/#exit

    Ce qui n'est pas normale, c'est que le process ne ferme quand il n'y as plus fenêtre.


    tu peut essayer de voir avec ceci. on ne sait jamais
    http://qt.developpez.com/doc/latest/...dowclosed-prop

    Peut tu montrer le main.cpp?


    PS : Je dois mal le faire mais j'aurais aussi aimé faire en sorte de créer un petit QLabel avec dedans "Chargement en cours..." et dès qu'on arrive au slot affichage, on affiche le vrai contenu de la fenêtre mais, j'ai pas le contenu de la fenêtre j'ai du début à la fin la QLabel "Chargement en cours..." sans jamais voir le contenu graphique du slot affichage
    regarde http://qt.developpez.com/doc/latest/qsplashscreen/ c'est fait pour

    Plus d’explications dans les cours et tutoriels pour apprendre Qt et la FAQ Qt.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Mais de toute façon il y a un souci vu que normalement quand on quitte la fenêtre principale toute le programme se ferme et la non...
    ca c'est normale.
    Dans la logique si on quitte par la petite croix la fenêtre principale le programme se ferme entièrement et dans moi c'est pas le cas donc c'est pas normal !?

    Si tu veut forcer la fermeture, tu peut utilise QApplication::exit();
    http://qt.developpez.com/doc/latest/...lication/#exit

    Ce qui n'est pas normale, c'est que le process ne ferme quand il n'y as plus fenêtre.


    tu peut essayer de voir avec ceci. on ne sait jamais
    http://qt.developpez.com/doc/latest/...dowclosed-prop
    Pourquoi pas mais c'est quand même bizarre que c'est pas naturellement fait...



    Voilà le main.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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include "listeur.h"
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        qint64 processId = app.applicationPid();
     
        QSharedMemory sharedMemory;
     
        sharedMemory.setKey("pid");
     
        if(!sharedMemory.create(sizeof(processId)))
        {
            if(sharedMemory.error() == QSharedMemory::AlreadyExists)
            {
                if(sharedMemory.attach(QSharedMemory::ReadOnly))
                {
                    sharedMemory.lock();
                    qint64 p = *(qint64 *)sharedMemory.constData();
                    sharedMemory.unlock();
     
                    QMessageBox::critical(0, QString(), QObject::tr(NOMLOGICIEL " est déjà en cours d'éxécution.<br />Processus : %1").arg(p));
                    return 1;
                }
            }
            else
            {
                qDebug() << sharedMemory.errorString();
            }
        }
        else
        {
            sharedMemory.lock();
            memcpy(sharedMemory.data(), &processId, sharedMemory.size());
            sharedMemory.unlock();
        }
     
        QApplication::setStyle(new QPlastiqueStyle);
        QApplication::setPalette(QApplication::style()->standardPalette());
        QApplication::setQuitOnLastWindowClosed(false);
     
        FenListeur listeur;
        listeur.show();
     
        return app.exec();
    }
    Merci

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par austin.fla Voir le message
    Dans la logique si on quitte par la petite croix la fenêtre principale le programme se ferme entièrement et dans moi c'est pas le cas donc c'est pas normal !?
    Qu'es ce que pour toi une fenêtre principale?


    c'est plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QApplication::setQuitOnLastWindowClosed(true);

    au lieu de return app.exec();
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int ret =app.exec();
    qDebug() <<"end";
    return ret;
    Pour voir si tu sort bien de l'eventloop du thread principale

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Pour l'histoire de la fenêtre principale, je veux dire qu'il y a la fenêtre QMainWindow et une autre fenêtre QDialog qui hérite de la fenêtre QMainWindow, donc si on quitte la fenêtre QMainWindow le programme doit se fermer même si la fenêtre QDialog est encore ouverte non ? Enfin dans ma logique ça devrait le fait

    J'avais lu un tutoriel Qt dessus et la valeur été à false

    EDIT : Je ne comprends pas du tout, mais en remplacent false par true ça marche nikel pourtant dans mes autre programme j'utilise false et j'ai jamais eu de problème

    Merci beaucoup !!!

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par austin.fla Voir le message
    Je ne comprends pas du tout, mais en remplacent false par true ça marche nikel pourtant dans mes autre programme j'utilise false et j'ai jamais eu de problème
    Cette option sert à ce que l'eventlopp principale et donc le process ne se ferme pas automatique quand y as plus de fenêtre.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Ok merci beaucoup ce problème de code me gêner beaucoup...

    Merci et bonne journée

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

Discussions similaires

  1. problème de fermeture de l'application
    Par allanibu dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2008, 12h03
  2. Problème de fermeture de l'application
    Par devat27 dans le forum Langage
    Réponses: 9
    Dernier message: 20/03/2008, 12h05
  3. [VB2005] Problème de fermeture de l'application
    Par exclusif dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/08/2006, 15h32
  4. [C#] problème de fermeture d'une application
    Par padodanle51 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/05/2006, 14h07
  5. Problème de fermeture de l'application
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 02h06

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