Comportement étrange de QApplication
Bonjour à tous
J'essaie de transférer la création de l'objet QApplication hors de main() mais j'obtiens des erreurs d'execution que je ne comprends pas.
Voici les différentes versions testées :
Code:
1 2 3 4 5 6 7 8 9
| #include <QtGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow* w = new QMainWindow();
w->show();
return app.exec();
} |
Pas de problème, c'est la version "par défaut"
Maintenant, je transfère la création de QApplication dans un objet :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <QtGui>
class Engine
{
public:
Engine(int argc, char *argv[])
{
new QApplication(argc, argv);
}
int exec()
{
return QApplication::exec();
}
};
int main(int argc, char *argv[])
{
Engine engine(argc, argv);
QMainWindow* w = new QMainWindow();
w->show(); //
return engine.exec();
} |
Là, ça plante (d'après le debugeur, un "Segmentation fault" sur QWidget::show)
Si je transfère la création de la fenêtre dans le constructeur, ça fonctionne à nouveau :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <QtGui>
class Engine
{
public:
Engine(int argc, char *argv[])
{
new QApplication(argc, argv);
QMainWindow* w = new QMainWindow();
w->show();
}
int exec()
{
return QApplication::exec();
}
};
int main(int argc, char *argv[])
{
Engine engine(argc, argv);
return engine.exec();
} |
Si ensuite, je crée une fonction spécifique pour créer la fenêtre... ça plante :
Code:
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
| #include <QtGui>
class Engine
{
public:
Engine(int argc, char *argv[])
{
new QApplication(argc, argv);
}
void show()
{
QMainWindow* w = new QMainWindow();
w->show();
}
int exec()
{
return QApplication::exec();
}
};
int main(int argc, char *argv[])
{
Engine engine(argc, argv);
engine.show();
return engine.exec();
} |
Le debugeur me donne un "Segmentation fault" sur QCoreApplication::exec()
Quelqu'un aurait une explication et une solution pour implémenter la dernière version ?
EDIT : suite à une remarque de Johnlamericain : le code fonctionne sous windows mais pas sous linux