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 :

Problème avec les TrayIcone sous linux

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Problème avec les TrayIcone sous linux
    Bonsoir,

    Voila je débute sous Qt et j'ai du mal avec le système de TrayIcone. Mon problème est que sous windows le programme marche très bien mais lorsque je le compile et l'execute sous linux cela ne marche pas j'ai droit à un jolie segmentation fault. Voici le code:

    ptray.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
    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
    #ifndef PTRAY_H
    #define PTRAY_H
     
    #include <QSystemTrayIcon>
    #include "pnoteeditor.h"
     
    class QAction;
    class QMenu;
    class QString;
     
    class PTray : PNoteEditor
    {
          Q_OBJECT
     
          public:
                PTray ();
                void setVisible (bool visible);
     
          protected:
                void closeEvent (QCloseEvent *event);
     
          private slots:
                void iconActivated (QSystemTrayIcon::ActivationReason reason);
                void showMessage ();
                void messageClicked ();
                void newNote ();
                void editNote ();
                void on_noteTitleChanged (const QString &str = "");
                void on_noteTextChanged (const QString &str = "");
                void showConfigDialog ();
                void removeActionFromHistory (QAction *);
                void on_settingsUpdated ();
                void quitTray ();
                void loadRssFile (const QString&);
          private:
                void createActions ();
                void createTrayIcon ();
                void addNoteToHistory (const QString &title = "", const QString &body = "");
                void writeSettings ();
                void writeNotes ();
                void readSettings ();
                QAction *quitAction;
                QAction *minimizeAction;
                QAction *maximizeAction;
                QAction *restoreAction;
                QAction *newNoteAction;
                QAction *currentNoteAction;
                QAction *configAction;
                QActionGroup *history;
                QSystemTrayIcon *trayIcon;
                QMenu *trayIconMenu;
                bool warnOnClose;
                QString notesFileName ;
                QString iconFileName ;
    };
     
    #endif
    ptray.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
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    #include <QtGui>
    #include "ptray.h"
    #include "pconfigdialog.h"
    #include "pxmlhandler.h"
     
    PTray::PTray () : PNoteEditor ()
    {
          warnOnClose = false;
          readSettings ();
          createActions ();
          createTrayIcon ();
          connect (trayIcon, SIGNAL (messageClicked ()), this, SLOT (messageClicked ()));
          connect (trayIcon, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), this, SLOT (iconActivated (QSystemTrayIcon::ActivationReason)));
          connect (this, SIGNAL (noteTitleChanged (const QString&)), this, SLOT (on_noteTitleChanged (const QString&)));
          connect(this, SIGNAL (noteTextChanged (const QString&)), this, SLOT (on_noteTextChanged (const QString&)));
          trayIcon->show ();
          setVisible (true);
          setNoteTitle ("");
          setNoteText ("");
          loadRssFile (notesFileName);
    }
     
    void PTray::loadRssFile (const QString &fileName)
    {
          int i;
     
          if(QFile::exists (fileName))
          {
                QFile file (fileName);
                QXmlInputSource inputSource (&file);
                QXmlSimpleReader reader;
                QList<QAction *> list;
                PXmlHandler handler (&list);
                reader.setContentHandler (&handler);
                reader.setErrorHandler (&handler);
                reader.parse (inputSource);
                for(i=0;i<list.count ();i++)
                {
                      QAction *act = list.at (i);
                      addNoteToHistory (act->text (), act->toolTip ());
                }
          }
    }
     
    void PTray::writeNotes ()
    {
          QFile file (notesFileName);
          if (!file.open (QFile::WriteOnly | QFile::Text))
          {
                QMessageBox::warning(this, tr ("Pense bête"),
    			    tr ("Ne peut pas écrire de fichier %1:\n%2.")
    			    .arg (notesFileName)
    			    .arg (file.errorString ()));
          }
          else
          {
                QTextStream out (&file);
                out.setCodec ("UTF-8");
                QApplication::setOverrideCursor (Qt::WaitCursor);
                QApplication::restoreOverrideCursor ();
                out << "<?xml version=\"1.0\"?>\n<rss version=\"2.0\">\n<channel>\n";
                out << "<title>Pense bête</title>\n";
                out << "<link>fichier://" << notesFileName << "</link>\n";
                out << "<description>fichier de données Pense bête.</description>\n";
                out << "<language>" << QLocale::system ().name () << "</language>\n";
                out << "<pubDate>" << QDateTime::currentDateTime ().toString (Qt::TextDate) << "</pubDate>\n";
                out << "<lastBuildDate>" << QDateTime::currentDateTime().toString(Qt::TextDate) << "</lastBuildDate>\n";
                out << "<docs></docs>\n";
                out << "<generator>Pense bête 1.0</generator>\n";
                out << "<managingEditor></managingEditor>\n";
                out << "<webMaster></webMaster>\n";
                out << "<ttl></ttl>\n\n";
                QAction *ita;
                foreach (ita, history->actions ())
                {
                      if (!ita->text ().isEmpty () )
                      {
                            out << "<item>\n<title>" << Qt::escape (ita->text ()) << "</title>\n<link>fichier://" << Qt::escape (notesFileName) << "</link>\n";
                            out << "<description>" << Qt::escape (ita->toolTip ()) << "</description>\n<pubDate>" << Qt::escape (QDateTime::currentDateTime ().toString (Qt::TextDate)) << "</pubDate>\n<guid></guid>\n</item>\n\n";
                      }
                }
                out << "</channel>\n</rss>\n";
          }
    }
     
    void PTray::writeSettings ()
    {
          QSettings settings ("toto", "Pense bête");
          settings.setValue ("pos", pos ());
          settings.setValue ("size", size ());
          settings.setValue ("notesFileName", notesFileName);
          settings.setValue ("iconFileName", iconFileName);
    }
     
    void PTray::readSettings ()
    {
          QSettings settings ("toto", "Pense bête");
          QPoint pos = settings.value ("pos", QPoint (200, 200)).toPoint ();
          QSize size = settings.value ("size", QSize (800, 600)).toSize ();
          notesFileName = settings.value ("notesFileName","desktop_notes.rss").toString ();
          iconFileName = settings.value ("iconFileName",":/images/burn.png").toString ();
          setWindowIcon (QIcon (iconFileName));
          resize (size);
          move (pos);
    }
     
    void PTray::setVisible (bool visible)
    {
          minimizeAction->setEnabled (visible);
          maximizeAction->setEnabled (!isMaximized ());
          restoreAction->setEnabled (isMaximized () || !visible);
          PNoteEditor::setVisible (visible);
    }
     
    void PTray::closeEvent (QCloseEvent *event)
    {
          if (trayIcon->isVisible () && !warnOnClose)
          {
                QMessageBox::information (this, tr ("Pense bête"),
                                     tr ("Le programme continuera de fonctionner dans la "
                                         "barre des tâches. Pour quitter le programme, "
                                         "choisissez <b>Quitter</b> dans le menu contectuel "
                                         "d'entré de la barre des tâches."));
                warnOnClose = true;
                hide ();
                event->ignore ();
          }
          else if (warnOnClose)
          {
                hide ();
                event->ignore ();
          }
    }
     
    void PTray::iconActivated (QSystemTrayIcon::ActivationReason reason)
    {
          switch (reason)
          {
                case QSystemTrayIcon::Trigger:
                      if (isVisible ())
                      {
                            setVisible (false);
                      }
                      else
                      {
                            showNormal ();
                      }
                      break;
                case QSystemTrayIcon::DoubleClick:
                      break;
                case QSystemTrayIcon::MiddleClick:
                      showMessage ();
                      break;
                default:
                      ;
          }
    }
     
    void PTray::showConfigDialog ()
    {
          setVisible (true);
          PConfigDialog *config = new PConfigDialog (this);
          config->setMinimumSize (config->size ());
          config->setMaximumSize (config->size ());
          connect (config, SIGNAL (noteRemoved (QAction *)),this, SLOT (removeActionFromHistory (QAction *)));
          connect (config, SIGNAL (settingsUpdated ()),this, SLOT (on_settingsUpdated ()));
          config->setNoteList (history);
          config->show ();
    }
     
    void PTray::on_settingsUpdated ()
    {
          readSettings ();
          trayIcon->setIcon (QIcon (iconFileName));
    }
     
    void PTray::removeActionFromHistory (QAction *action)
    {
          if (action != currentNoteAction)
          {
                history->removeAction (action);
                trayIconMenu->removeAction (action);
          }
    }
     
    void PTray::showMessage ()
    {
          trayIcon->showMessage (noteTitle (), noteText (), QSystemTrayIcon::Information,15 * 1000);
    }
     
    void PTray::messageClicked ()
    {
          showNormal ();
    }
     
    void PTray::on_noteTitleChanged (const QString &str)
    {
          QAction *ita = history->checkedAction ();
          ita->setText (str);
    }
     
    void PTray::on_noteTextChanged (const QString &str)
    {
          QAction *ita = history->checkedAction ();
          ita->setToolTip (str);
    }
     
    void PTray::addNoteToHistory (const QString &title, const QString &body)
    {
          QAction *oldNote = new QAction (title, this);
          oldNote->setToolTip (body);
          oldNote->setCheckable (true);
          oldNote->setChecked (false);
          connect (oldNote, SIGNAL (triggered ()), this, SLOT (editNote ()));
          trayIconMenu->addAction (oldNote);
          history->addAction (oldNote);
    }
     
    void PTray::newNote ()
    {
          setVisible (true);
          addNoteToHistory (noteTitle (), noteText ());
          setNoteTitle ("");
          setNoteText ("");
          writeNotes ();
    }
     
    void PTray::editNote ()
    {
          QAction *action = qobject_cast<QAction*> (sender ());
          if (action)
          {
                setNoteTitle (action->text ());
                setNoteText (action->toolTip ());
          }
    }
     
    void PTray::quitTray ()
    {
          writeNotes ();
          writeSettings ();
          qApp->quit ();
    }
     
    void PTray::createActions ()
    {
          minimizeAction = new QAction (tr ("Réduire la fenêtre"), this);
          minimizeAction->setIcon (QIcon (":/images/minimize.png"));
          connect (minimizeAction, SIGNAL (triggered ()), this, SLOT (hide ()));
          maximizeAction = new QAction (tr ("Agrandir la fenêtre"), this);
          maximizeAction->setIcon (QIcon (":/images/maximize.png"));
          connect (maximizeAction, SIGNAL (triggered ()), this, SLOT (showMaximized ()));
          restoreAction = new QAction(tr("Restaurer"), this);
          restoreAction->setIcon (QIcon (":/images/restaure.png"));
          connect (restoreAction, SIGNAL (triggered ()), this, SLOT (showNormal ()));
          quitAction = new QAction (tr ("Quitter"), this);
          quitAction->setIcon (QIcon (":/images/exit.png"));
          connect (quitAction, SIGNAL (triggered ()), this, SLOT (quitTray ()));
          newNoteAction = new QAction (tr ("Nouvelle note"), this);
          newNoteAction->setIcon (QIcon (":/images/list_add.png"));
          connect (newNoteAction , SIGNAL (triggered ()), this, SLOT (newNote ()));
          currentNoteAction = new QAction (tr ("Note en cours"), this);
          connect (currentNoteAction , SIGNAL (triggered ()), this, SLOT (editNote ()));
          configAction = new QAction (tr ("Configurer"), this);
          configAction->setIcon (QIcon (":/images/configure.png"));
          connect (configAction, SIGNAL (triggered ()), this, SLOT (showConfigDialog ()));
          history = new QActionGroup (this);
          history->addAction (currentNoteAction);
          currentNoteAction->setCheckable (true);
          currentNoteAction->setChecked (true);
    }
     
    void PTray::createTrayIcon ()
    {
          trayIconMenu = new QMenu (this);
          trayIconMenu->addAction (minimizeAction);
          trayIconMenu->addAction (maximizeAction);
          trayIconMenu->addAction (restoreAction);
          trayIconMenu->addSeparator ();
          trayIconMenu->addAction (configAction);
          trayIconMenu->addAction (newNoteAction);
          trayIconMenu->addAction (currentNoteAction);
          trayIconMenu->addSeparator ();
          trayIconMenu->addAction (quitAction);
          trayIcon = new QSystemTrayIcon (this);
          trayIconMenu->addSeparator ();
          trayIcon->setContextMenu (trayIconMenu);
          trayIcon->setIcon (QIcon (iconFileName));
    }
    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
    #include <QtGui>
    #include "ptray.h"
     
    int main (int argc, char **argv)
    {
          QApplication app(argc, argv);
          if (!QSystemTrayIcon::isSystemTrayAvailable ())
          {
                QMessageBox::critical (0, QObject::tr ("Pense bête"),
                                  QObject::tr ("Aucune barre des tâches n'a été détecté "
                                              "sur ce système."));
     
                return 1;
          }
          PTray window;
     
          return app.exec();
    }
    Pour information je l'ai passé sous gdb et il me dit que l'erreur survient a la ligne:

    Dans le main. Voici le rapport:

    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
    Program terminated with signal 11, Segmentation fault.
    [New process 9830]
    #0  0xb78df368 in ?? () from /usr/lib/libQtGui.so.4
    (gdb) b main
    Breakpoint 1 at 0x804f3c5: file main.cpp, line 6.
    (gdb) r
    Starting program: /home/...... 
    [Thread debugging using libthread_db enabled]
    [New Thread 0xb70beb60 (LWP 9843)]
    [Switching to Thread 0xb70beb60 (LWP 9843)]
     
    Breakpoint 1, main (argc=1, argv=0xbf85ee64) at main.cpp:6
    6       QApplication app(argc, argv);
    (gdb) n
    Qt: gdb: -nograb added to command-line options.
    Use the -dograb option to enforce grabbing.
    7       if (!QSystemTrayIcon::isSystemTrayAvailable ())
    (gdb) n
    15       PTray window;
    (gdb) n
     
    Program received signal SIGSEGV, Segmentation fault.
    0xb797e368 in ?? () from /usr/lib/libQtGui.so.4
    Merci d'avance

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

    Il faudrait que tu poursuives ton pas à pas jusqu'à situer l'endroit du plantage. Ce peut être dans le constructeur de PTray ou celui de PNoteEditor.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Et bien justement lorsque je veux continuer gdb s'arrete et reprend au début pour me donner toujours la même erreur . Sinon le constructeur de PNoteEditor est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PNoteEditor (QWidget *parent = 0);
    Si vous voulez le reste de la classe je le posterai

  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
    Peux-tu taper "backtrace" (ou bt) après que gdb ait crashé stp ? On aura plus d'infos avec ça.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Voici ce que gdb me donne après "backtrace":

    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
    (gdb) backtrace
    #0  0xb7974368 in ?? () from /usr/lib/libQtGui.so.4
    #1  0x08057ead in PXmlHandler::endElement (this=0xbfecd30c, namespaceURI=@0xbfecce40, localName=@0xbfecce3c, qName=@0x81084c4) at pxmlhandler.cpp:42
    #2  0xb7f71303 in ?? () from /usr/lib/libQtXml.so.4
    #3  0xb7f7cc12 in ?? () from /usr/lib/libQtXml.so.4
    #4  0xb7f7d7eb in ?? () from /usr/lib/libQtXml.so.4
    #5  0xb7f7cdbb in ?? () from /usr/lib/libQtXml.so.4
    #6  0xb7f7d7eb in ?? () from /usr/lib/libQtXml.so.4
    #7  0xb7f7cdbb in ?? () from /usr/lib/libQtXml.so.4
    #8  0xb7f7de77 in ?? () from /usr/lib/libQtXml.so.4
    #9  0xb7f7e33e in QXmlSimpleReader::parse () from /usr/lib/libQtXml.so.4
    #10 0xb7f6b270 in QXmlSimpleReader::parse () from /usr/lib/libQtXml.so.4
    #11 0x08056bb9 in PTray::loadRssFile (this=0xbfecd3d8, fileName=@0xbfecd424) at ptray.cpp:36
    #12 0x08056f27 in PTray (this=0xbfecd3d8) at ptray.cpp:20
    #13 0x0804f5b5 in main (argc=Cannot access memory at address 0x0) at main.cpp:15
    Si cela peut aider

  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
    La dernière fonction de ton code qui est utilisée est PTray::loadRssFile(). Il faut que tu traces en pas à pas dans cette fonction (en commençant par y mettre un bp, vu que c'est appelé depuis la boucle d'événement). C'est probable qu'utilisant un conteneur de pointeurs, il soit mal initialisé et contienne donc un pointeur invalide.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Si c'est le cas pourquoi cela marcherait-il sous windows ? oula je commence à avoir mal à la tête Pourtant je ne vois vraiment pas ou j'ai pu me tromper dans le codage de ma fonction

    Sinon pour gdb tu aurais un bon tuto parce que je ne sais absolument pas m'en servir pour que je fasse fonctionner ma fonction en pas à pas en posant un bp. Ou alors comme tu as l'air de t'y connaître jette un coup d'œil sur la fonction pour voir si tu vois une erreur stp:

    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
    void PTray::loadRssFile (const QString &fileName)
    {
          int i;
     
          if(QFile::exists (fileName))
          {
                QFile file (fileName);
                QXmlInputSource inputSource (&file);
                QXmlSimpleReader reader;
                QList<QAction *> list;
                PXmlHandler handler (&list);
                reader.setContentHandler (&handler);
                reader.setErrorHandler (&handler);
                reader.parse (inputSource);
                for(i=0;i<list.count ();i++)
                {
                      QAction *act = list.at (i);
                      addNoteToHistory (act->text (), act->toolTip ());
                }
          }
    }
    Dans les deux cas merci

  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
    Je pense justement que l'erreur ne se situe pas ici mais dans le constructeur de PXmlHandler.

    Je ne connais pas très bien gdb, j'utilise VC++; mais tu trouveras les infos nécessaires sur des pages comme celles-ci:
    * http://www.cs.princeton.edu/~benjasik/gdb/gdbtut.html
    * http://www.cs.cmu.edu/~gilpin/tutorial/

    Tu pourrais en plus vérifier que le pointeur "act" que tu obtiens dans ton for ne soit pas un pointeur NULL (ou alors, tu y mets un assert si le comportement n'est pas sensé arriver).

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Merci pour les adresses je vais regarder cela Sinon voici le constructeur de PXmlHandler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PXmlHandler::PXmlHandler (QList<QAction *> *newList)
    {
    	actionList = newList;
    	currentText = "";
    	haveItem = false;
    }
    Je vais aussi rajouter une condition pour mon pointeur afin de voir si il vaut NULL.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Alors la je crois que c'est la meilleur de l'année je change de buro (passage de gnome à KDE) je compile sous KDE et sa marche très bien. Je crois que je suis vraiment mais alors vraiment perdu

    Y-a-t-il une raison du fait de ce qui vient de ce passer ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    A non j'ai rien dit il ne marche qu'une seule fois, une fois que je quitte je ne peux plus le rééxecuter.... pour le refaire marcher je dois le recompiler encore une fois et après toujours pareil si je quitte...

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Bon j'ai recommencer depuis le début le développement de mon appli fonction par fonction, et j'ai peux être trouver le soucis si vous me le confirmé. Lorsque j'ajoute ceci au constructeur de PTray:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connect(this, SIGNAL (noteTextChanged (const QString&)), this, SLOT (on_noteTextChanged (const QString&)));
    connect (this, SIGNAL (noteTitleChanged (const QString&)), this, SLOT (on_noteTitleChanged (const QString&)));
    Voici la fonction on_noteTextChanged:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void PTray::on_noteTextChanged (const QString &str)
    {
          QAction *ita = history->checkedAction ();
          ita->setToolTip (str);
    }
    La fonction on_noteTitleChanged:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void PTray::on_noteTitleChanged (const QString &str)
    {
          QAction *ita = history->checkedAction ();
          ita->setText (str);
    }
    La déclaration de history ce fait dans le .h et est:

    Le constructeur en entier est:

    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
    PTray::PTray () : PNoteEditor ()
    {
          warnOnClose = false;
          readSettings ();
          createActions ();
          createTrayIcon ();
          connect (trayIcon, SIGNAL (messageClicked ()), this, SLOT (messageClicked ()));
          connect (trayIcon, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), this, SLOT (iconActivated (QSystemTrayIcon::ActivationReason)));
          connect (this, SIGNAL (noteTitleChanged (const QString&)), this, SLOT (on_noteTitleChanged (const QString&)));
          connect(this, SIGNAL (noteTextChanged (const QString&)), this, SLOT (on_noteTextChanged (const QString&)));
          trayIcon->show ();
          setVisible (true);
          setNoteTitle ("");
          setNoteText ("");
          loadRssFile (notesFileName);
    }
    J'ai un segmentation fault, et lorsque je ne l'ajoute pas l'appli marche. Qu'est ce qui pourrait provoquer cette erreur dans cette simple ligne ?

  13. #13
    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
    Toujours dans la série supposition, 0 est une valeur valable pour le retour de history->checkedActions(). Assure toi donc de tester la validité du pointeur avant de t'en servir.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Cela revient au même

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Non j'ai rien dit c'est moi qui vérifiait mal. Mais le problème n'est pas entièrement résolu, j'ai trouvé la dernière source du problème qui me provoquait un segmentation fault. C'est la fonction loadRssFile qui est (je la remet):

    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
    void PTray::loadRssFile (const QString &fileName)
    {
          int i;
     
          if(QFile::exists (fileName))
          {
                QFile file (fileName);
                QXmlInputSource inputSource (&file);
                QXmlSimpleReader reader;
                QList<QAction *> list;
                PXmlHandler handler (&list);
                reader.setContentHandler (&handler);
                reader.setErrorHandler (&handler);
                reader.parse (inputSource);
                for(i=0;i<list.count ();i++)
                {
                      QAction *act = list.at (i);
                      addNoteToHistory (act->text (), act->toolTip ());
                }
          }
    }
    Et plus précisément de l'une de ces 3 lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PXmlHandler handler (&list);
    reader.setContentHandler (&handler);
    reader.setErrorHandler (&handler);
    Tu avais donc raison cela vient d'une fonction de PXmlHandler. La voici:

    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
    bool PXmlHandler::endElement (const QString &namespaceURI, const QString &localName, const QString &qName)
    {
          if (haveItem)
          {
                if (qName == "title")
                {
                      currentAction->setText (currentText);
                }
          }
    	else
    	{
    	    if (qName == "description")
    	    {
    	          currentAction->setToolTip (currentText);
    	    }
    	    else
    	    {
    	          if (qName == "item")
    	          {
    	                actionList->append (currentAction);
                          haveItem = false;
                    }
    	    }
        }
     
        return true;
    }
    Et encore un peu plus précisément cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    currentAction->setToolTip (currentText);
    Pourtant je ne vois vraiment pas pourquoi... Qu'est ce qui peut bien clocher ?

  16. #16
    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
    currentAction est-il bien un pointeur valide (non seulement non null, mais aussi assigné) ?

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    B normalement oui, voici le .h de PXmlHandler:

    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
    #ifndef PXMLHANDLER_H
    #define PXMLHANDLER_H
     
    #include <QXmlDefaultHandler>
    #include <QList>
    #include <QAction>
     
    class QString;
     
     
    class PXmlHandler : public QXmlDefaultHandler
    {
    	public:
    		PXmlHandler (QList<QAction *> *newList);
    		bool startElement (const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes);
    		bool endElement (const QString &namespaceURI, const QString &localName, const QString &qName);
    		bool characters (const QString &str);
    		bool fatalError (const QXmlParseException &exception);
    	private:
    		QList<QAction *> *actionList;
    		QString currentText;
    		QAction *currentAction;
    		bool haveItem;
    };
     
    #endif
    et le .c :

    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
    #include "pxmlhandler.h"
    #include <QMessageBox>
     
    PXmlHandler::PXmlHandler (QList<QAction *> *newList)
    {
    	actionList = newList;
    	currentText = "";
    	haveItem = false;
    }
     
    bool PXmlHandler::startElement (const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes)
    {
    	if (qName == "item")
    	{
    		currentAction = new QAction (QString ("none"),0);
    		haveItem = true;
    	}
    	else
    	{
    	    if (qName == "title" || qName == "description")
    	    {
    	          currentText = "";
    	    }
    	}
     
    	return true;
    }
     
    bool PXmlHandler::endElement (const QString &namespaceURI, const QString &localName, const QString &qName)
    {
          if (haveItem)
          {
                if (qName == "title")
                {
                      currentAction->setText (currentText);
                }
          }
    	else
    	{
    	    if (qName == "description")
    	    {
    	          currentAction->setToolTip (currentText);
    	    }
    	    else
    	    {
    	          if (qName == "item")
    	          {
    	                actionList->append (currentAction);
                          haveItem = false;
                    }
    	    }
        }
     
        return true;
    }
     
    bool PXmlHandler::characters (const QString &str)
    {
    	currentText += str ;
     
    	return true;
    }
     
    bool PXmlHandler::fatalError (const QXmlParseException &exception)
    {
    	QMessageBox::warning (0,QObject::tr ("Pense bête XML/RSS parser"),
    		QObject::tr ("erreur de parse à la ligne %1, colonne %2:\n%3")
    		.arg (exception.lineNumber ())
    		.arg (exception.columnNumber ())
    		.arg (exception.message ())
    	);
     
    	return false;
    }

  18. #18
    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
    Y'a un trou

    Si qName est "title" ou "description" en début d'élément, tu n'instancie pas currentAction. Comme de plus tu ne l'initialises pas à 0 dans le constructeur, tu te retrouves à manipuler ou stocker un QAction* qui pointe dans le vent.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Super c'était bien ça, j'ai donc mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentAction = new QAction (QString ("none"),0);
    Dans le constructeur et plus de segmentation fault

    Merci beaucoup de ton aide en tout cas et merci aussi à gdb qui à permit de trouver la ligne qui faisait planter

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

Discussions similaires

  1. Problème avec les accents sous xml.
    Par simplyme dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 11/07/2009, 19h52
  2. Problèmes avec les webservices sous VS 2008 ( CTP )
    Par Amokrane dans le forum Framework .NET
    Réponses: 3
    Dernier message: 25/12/2007, 18h36
  3. Problème avec les conditions ''sous-ensemble d'un tableau''
    Par djangossoul dans le forum LabVIEW
    Réponses: 2
    Dernier message: 07/06/2007, 12h23
  4. Problème avec les servlets sous eclipse
    Par supertoms dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 03/03/2007, 19h07
  5. problème avec les div sous Mozilla
    Par MrsFrizz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2005, 11h54

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