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 :

Crash avec QAction::setIcon


Sujet :

Qt

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Crash avec QAction::setIcon
    Bonjour à tous !

    J'ai rencontré un problème dans mon programme avec Qt. Celui-ci crash systématiquement lorsque j'essaye d'attribuer une icone à une QAction.

    J'ai créer une fenêtre héritant de QMainWindows, les QActions, la QToolBar, les fonctions, slots, etc...
    Jusqu'ici tout va bien... jusqu'au moment où je me décide d'ajouter des icônes à mes QAction: "Le programme s'est terminé subitement". Dès que j'enlève ces QIcon, le programme tourne parfaitement.
    Voici une des lignes qui pose problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ouvreOrdi->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/ouvrir_ordi.png"));
    J'ai aussi essayé de créer l'icone séparément puis de l'ajouter. Même problème (ci-dessous j'ai crée le QIcon sans pointeur, mais avec ça donne le même résultat).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QIcon monIcone(QCoreApplication::applicationDirPath() + "/icones_qaction/sauver_sql.png");
    Aussi, même quand je créer seulement l'icone toute seule, sans l'assigner à quoi que ce soit, ça crash aussi ! Je n'y comprend plus rien.

    Et puis ce qui est encore plus bizarre, c'est que quand j'utilise la méthode QMainWindows::setWindowIcon(), il n'y a aucun problème !
    Si vous pouviez m'éclairer, je vous en remercie. Vous me seriez d'une grande utilité .



    Ci-dessous une partie de mon code.

    Le .h de ma fenêtre:
    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
    70
    71
    72
    73
    74
    75
    76
    77
    #ifndef PROGRAMWINDOW_H
    #define PROGRAMWINDOW_H
     
    #include <iostream>
    #include <string>
    #include <vector>
    #include <fstream>
    #include <QWidget>
    #include <QStandardItemModel>
    #include <QTableView>
    #include <QLabel>
    #include <QBoxLayout>
    #include <QMainWindow>
    #include <QIcon>
    #include <QMenuBar>
    #include <QCoreApplication>
    #include <QInputDialog>
    #include <QMessageBox>
    #include <QStatusBar>
    #include <QToolBar>
    #include "buyers.h"
     
    class ProgramWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        ProgramWindow();
        void activating(bool status);
     
    public slots:
        void FnouveauFichier();
        void FouvreSQL();
        void FouvreOrdi();
        void FprendSQL();
        void FprendOrdi();
        void FnouvProduit();
        void FnouvAcheteur();
        void FnouvTransaction();
        void Fajouter();
        void Fpayer();
        void FlisteTransactions();
        void Fpaid();
     
    private:
        CentralField *field;
        std::vector<products*> productVector;
        std::vector<buyer*> buyerVector;
        int choice;
        int car1;
        int car2;
        double quad;
        int turn;
        bool validate;
        char bike;
        std::string devise;
        std::string truck1;
        std::string truck2;
        std::string truck3;
        std::ifstream read;
        std::ofstream write;
     
        QAction *nouveauFichier;
        QAction *ouvreSQL;
        QAction *ouvreOrdi;
        QAction *prendSQL;
        QAction *prendOrdi;
        QAction *quitter;
        QAction *nouvProduit;
        QAction *nouvAcheteur;
        QAction *nouvTransaction;
        QAction *ajouter;
        QAction *payer;
        QAction *listeTransactions;
        QAction *depense;
        QToolBar *actionBar;
    };
    (D'autres classes sont aussi présents dans le fichier mais je ne les montre pas par soucis de clarté)

    Le constructeur de ma 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
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    ProgramWindow::ProgramWindow()
    {
     
        QMenu *menuFichier = menuBar()->addMenu("&File");
        QMenu *menuEdition = menuBar()->addMenu("&Edit");
        QMenu *menuAffichage = menuBar()->addMenu("Information");
     
        nouveauFichier = menuFichier->addAction("New file");
        QMenu *ouvrir = menuFichier->addMenu("Open");
            ouvreSQL = ouvrir->addAction("From SQL database");
            ouvreOrdi = ouvrir->addAction("From computer");
        QMenu *sauvegarder = menuFichier->addMenu("Save");
            prendSQL = sauvegarder->addAction("In the SQL database");
            prendOrdi = sauvegarder->addAction("In the computer");
        quitter = menuFichier->addAction("Quit");
     
        QMenu *nouveau = menuEdition->addMenu("New");
            nouvProduit = nouveau->addAction("Product");
            nouvAcheteur = nouveau->addAction("Buyer");
            nouvTransaction = nouveau->addAction("Transaction");
        ajouter = menuEdition->addAction("Add quantity");
        payer = menuEdition->addAction("Payement");
     
        listeTransactions = menuAffichage->addAction("Transactions");
        depense = menuAffichage->addAction("Money spent");
     
     
        listeTransactions->setShortcut((QKeySequence("Ctrl+P")));
        listeTransactions->setShortcut((QKeySequence("Ctrl+B")));
        listeTransactions->setShortcut((QKeySequence("Ctrl+T")));
        listeTransactions->setShortcut((QKeySequence("Ctrl+L")));
     
     
        nouveauFichier->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/new_fichier.png"));
        ouvreSQL->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/ouvrir_sql.png"));
        ouvreOrdi->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/ouvrir_ordi.png"));
        prendSQL->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/sauver_sql.png"));
        prendOrdi->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/sauver_ordi.png"));
        nouvProduit->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/new_produit.png"));
        nouvAcheteur->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/new_acheteur.png"));
        nouvTransaction->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/new_transaction.png"));
        ajouter->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/ajouter_quantite.png"));
        payer->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/payer.png"));
        listeTransactions->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/transactions.png"));
        depense->setIcon(QIcon(QCoreApplication::applicationDirPath() + "/icones_qaction/depense.png"));
     
     
        actionBar = addToolBar("ToolBar");
        actionBar->addAction(nouveauFichier);
     
     
        QObject::connect(nouveauFichier, SIGNAL(triggered()), this, SLOT(FnouveauFichier()));
        QObject::connect(ouvreSQL, SIGNAL(triggered()), this, SLOT(FouvreSQL()));
        QObject::connect(ouvreOrdi, SIGNAL(triggered()), this, SLOT(FouvreOrdi()));
        QObject::connect(prendSQL, SIGNAL(triggered()), this, SLOT(FprendSQL()));
        QObject::connect(prendOrdi, SIGNAL(triggered()), this, SLOT(FprendOrdi()));
        QObject::connect(quitter, SIGNAL(triggered()), qApp, SLOT(quit()));
     
        QObject::connect(nouvProduit, SIGNAL(triggered()), this, SLOT(FnouvProduit()));
        QObject::connect(nouvAcheteur, SIGNAL(triggered()), this, SLOT(FnouvAcheteur()));
        QObject::connect(nouvTransaction, SIGNAL(triggered()), this, SLOT(FnouvTransaction()));
        QObject::connect(ajouter, SIGNAL(triggered()), this, SLOT(Fajouter()));
        QObject::connect(payer, SIGNAL(triggered()), this, SLOT(Fpayer()));
     
        QObject::connect(listeTransactions, SIGNAL(triggered()), this, SLOT(FlisteTransactions()));
        QObject::connect(depense, SIGNAL(triggered()), this, SLOT(Fpaid()));
     
     
        field = new CentralField(buyerVector, productVector, devise);
        devise = "NONE";
     
        this->setCentralWidget(field);
        this->setWindowTitle("Commercial simulation");
        this->setWindowIcon(QIcon(QCoreApplication::applicationDirPath() + "/icone_fenetre.png"));
        this->setMinimumWidth(570);
        this->setMinimumHeight(350);
        this->activating(true);
    }
    Merci par avance !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Faites vous la création d'icone dans le constructeur de ProgramWindow() ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Oui et tout le problème est justement là. Pourtant cela marche sans problème pour setWindowIcon().

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Peut être parce que c'est un PNG ? Ou le chemin incorrect. Ou alors, car vous appelez une fonction alors que vous êtes dans votre constructeur. Sinon, qu'est ce qu'indique le débogueur ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Plus loin dans le programme, dans une autre classe, j'ai légèrement modifié un pointeur, et le problème s'est réglé.
    Je vérifiais s'il pointait, et si oui, le détruisait et lui donnait une nouvelle variable à pointeur. J'ai juste ajouté pointeur = 0 après sa destruction et dans le constructeur de la classe.

    Le problème était une "Segmentation fault", mais pas sur les QIcon.
    Bref le problème s'est réglé, merci quand même !

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

Discussions similaires

  1. apache crash avec mamp
    Par gtraxx dans le forum Apache
    Réponses: 8
    Dernier message: 16/04/2008, 21h16
  2. Crash avec boost::function
    Par Bakura dans le forum Boost
    Réponses: 15
    Dernier message: 22/12/2007, 16h26
  3. Crash avec wxTextCtrl::GetSelection()
    Par Mersenne dans le forum wxWidgets
    Réponses: 3
    Dernier message: 08/06/2007, 20h23
  4. Crash avec GenericDirCtrl
    Par tool69 dans le forum wxPython
    Réponses: 3
    Dernier message: 20/11/2006, 19h56
  5. [Installation] Crash avec la commande cvs init
    Par Pseudo01 dans le forum CVS
    Réponses: 1
    Dernier message: 19/11/2006, 09h35

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