Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Intégration Qt  (Lu 5014 fois)

0 Membres et 2 Invités sur ce sujet

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Intégration Qt
« le: Juillet 23, 2012, 12:06:17 pm »
Bonjour,

Je suis en train d'essayer d'intégrer SFML à Qt en suivant le tutoriel mais je me retrouve bloqué par une erreur qui me semble venir du fichier .pro mais je ne trouve pas.

Les erreurs sont les suivantes :

erreur : undefined reference to `sf::Window::Create(void*, sf::WindowSettings const&)'
erreur : undefined reference to `sf::Window::Display()'
erreur : collect2: ld returned 1 exit status

Voici ce que j'ai ajouté à mon fichier .pro

INCLUDEPATH += C:\librairies\SFML-1.6\include
LIBS += -L C:\librairies\SFML-1.6\lib -lsfml-graphics
 

Au cas ou je rajoute aussi mon code :

Le .h

#ifndef QSFMLCANVAS_H
#define QSFMLCANVAS_H

#include <SFML/Graphics.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <QWidget>
#include <QTimer>

class QSFMLCanvas : public QWidget, public sf::RenderWindow
{
    Q_OBJECT
   
public:
    explicit QSFMLCanvas(QWidget *parent = 0, const QPoint& Position = QPoint(0,0), const QSize& Size = QSize(800, 600), unsigned int FrameTime = 0);
    ~QSFMLCanvas();
   
private:
    virtual void OnInit();

    virtual void OnUpdate();

    virtual void showEvent(QShowEvent*);

    virtual void paintEvent(QPaintEvent*);

    QTimer *myTimer;
    bool   myInitialized;
};

#endif // QSFMLCANVAS_H
 

Le .cpp

#include "qsfmlcanvas.h"
#ifdef Q_WS_X11
    #include <Qt/qx11info_x11.h>
    #include <X11/Xlib.h>
#endif

QSFMLCanvas::QSFMLCanvas(QWidget *parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime) :
    QWidget(parent), myInitialized (false)
{
    // Mise en place de quelques options pour autoriser le rendu direct dans le widget
        setAttribute(Qt::WA_PaintOnScreen);
        setAttribute(Qt::WA_NoSystemBackground);

        // Définition de la position et de la taille du widget
        move(Position);
        resize(Size);

        // Préparation du timer
        myTimer->setInterval(FrameTime);
}

void QSFMLCanvas::showEvent(QShowEvent*)
{
    if (!myInitialized)
    {
        // Sous X11, il faut valider les commandes qui ont été envoyées au serveur
        // afin de s'assurer que SFML aura une vision à jour de la fenêtre
        #ifdef Q_WS_X11
            XFlush(QX11Info::display());
        #endif

        // On crée la fenêtre SFML avec l'identificateur du widget
        Create(winId());

        // On laisse la classe dérivée s'initialiser si besoin
        OnInit();

        // On paramètre le timer de sorte qu'il génère un rafraîchissement à la fréquence souhaitée
        connect(myTimer, SIGNAL(timeout()), this, SLOT(repaint()));
        myTimer->start();

        myInitialized = true;
    }
}

void QSFMLCanvas::paintEvent(QPaintEvent*)
{
    // On laisse la classe dérivée faire sa tambouille
    OnUpdate();

    // On rafraîchit le widget
    Display();
}

QSFMLCanvas::~QSFMLCanvas()
{

}
 

Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Intégration Qt
« Réponse #1 le: Juillet 23, 2012, 12:07:30 pm »
Il faut aussi lier à sfml-window et sfml-system.
Laurent Gomila - SFML developer

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Intégration Qt
« Réponse #2 le: Juillet 23, 2012, 12:40:26 pm »
Bonjour,

Merci ça corrige mes deux premières erreurs pour la troisième je continue de chercher auriez vous une idée d'où cela peut provenir? aurais je oublié autre chose?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Intégration Qt
« Réponse #3 le: Juillet 23, 2012, 12:42:12 pm »
Tu veux dire qu'il te reste juste
Citer
erreur : collect2: ld returned 1 exit status
?

Ce n'est pas possible, ça signifie juste qu'il y a eu des erreurs d'édition de liens ; du coup s'il n'y en a pas tu n'es pas censé avoir ce message non plus.

Fais un clean / rebuild all sur ton projet.
Laurent Gomila - SFML developer

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Intégration Qt
« Réponse #4 le: Juillet 23, 2012, 01:43:27 pm »
ça a fonctionné j'ai donc pu faire la suite (la partie mycanvas) mais l'erreur apparait de nouveau je tente des cleans mais rien n'y fait.

Sinon la fonction SetBackgroundColor() m'étais donnée comme non déclarée j'ai remplacé par clear() en attendant mais j'aurais aimé savoir si y avait quelque chose de spécial à inclure pour setbackgroundcolor.

Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Intégration Qt
« Réponse #5 le: Juillet 23, 2012, 02:11:14 pm »
SetBackgroundColor c'est du SFML 1.4, ça fait 4 ou 5 ans que ça n'existe plus.
Laurent Gomila - SFML developer

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Intégration Qt
« Réponse #6 le: Juillet 23, 2012, 02:34:20 pm »
Ah oui désolé j'étais sur un vieux tutoriel.

Toujours cette fameuse erreur : collect2: ld returned 1 exit status , je cherche ...

Merci pour les réponses rapides

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Intégration Qt
« Réponse #7 le: Juillet 23, 2012, 02:46:07 pm »
Assure-toi que tu n'as pas oublié de fermer ton exécutable (ou qu'il ne reste pas encore en mémoire même après fermeture).

Essaye aussi de redémarrer, on ne sait jamais.
Laurent Gomila - SFML developer

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Intégration Qt
« Réponse #8 le: Juillet 23, 2012, 03:12:41 pm »
Toujours pareil, je remet mon .pro au cas ou j'aurai fait une erreur :

INCLUDEPATH += C:\librairies\SFML-1.6\include

LIBS += -L C:\librairies\SFML-1.6\lib -lsfml-system
LIBS += -L C:\librairies\SFML-1.6\lib -lsfml-window
LIBS += -L C:\librairies\SFML-1.6\lib -lsfml-graphics
 


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Intégration Qt
« Réponse #9 le: Juillet 23, 2012, 03:29:20 pm »
L'ordre peut être important, essaye ça :
LIBS += -L C:\librairies\SFML-1.6\lib -lsfml-graphics -lsfml-window -lsfml-system

Si le problème persiste, colle nous la sortie de compilation complète.
Laurent Gomila - SFML developer

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Intégration Qt
« Réponse #10 le: Juillet 23, 2012, 03:43:47 pm »
Donc voici la sortie de compilation :

c:/qtsdk/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: warning: auto-importing has been activated without --enable-auto-import specified on the command line.
This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.
debug/moc_qsfmlcanvas.o:moc_qsfmlcanvas.cpp:(.rdata$_ZTV11QSFMLCanvas[vtable for QSFMLCanvas]+0xe8): undefined reference to `QSFMLCanvas::OnInit()'
debug/moc_qsfmlcanvas.o:moc_qsfmlcanvas.cpp:(.rdata$_ZTV11QSFMLCanvas[vtable for QSFMLCanvas]+0xec): undefined reference to `QSFMLCanvas::OnUpdate()'

collect2: ld returned 1 exit status
 

Voila, je compile depuis QtCreator.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Intégration Qt
« Réponse #11 le: Juillet 23, 2012, 03:54:34 pm »
T'allais nous le dire quand, que tu avais de vraies erreurs ? ;D
undefined reference to `QSFMLCanvas::OnInit()'
undefined reference to `QSFMLCanvas::OnUpdate()'

Est-ce que tu as bien ajouté QSFMLCanvas.cpp aux fichiers dans ton .pro ? Est-ce que ces deux fonctions sont bien définies dans le .cpp ?
Laurent Gomila - SFML developer

fabrice

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Intégration Qt
« Réponse #12 le: Juillet 23, 2012, 04:18:10 pm »
 :-[ ça compile merci, je m'en suis rendu compte entre temps pour ces erreur.

Maintenant ça crashe au lancement, j'ai encore du faire une bétise :)

Merci encore.