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

Auteur Sujet: [SFML2.1 / Qt4.8.5] SFML dans un widget  (Lu 2231 fois)

0 Membres et 1 Invité sur ce sujet

Toxicat

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
[SFML2.1 / Qt4.8.5] SFML dans un widget
« le: Mars 21, 2014, 12:29:32 am »
Bonjour, bonjour,

Après avoir suivis le tuto suivant : http://sfml-dev.org/tutorials/1.6/graphics-qt-fr.php et avoir corrigé les deux trois petites choses propres à SFML2.1 (Image -> Texture, GetFrameTime, etc), je me retrouve bien embêté.

En effet, rien de s'affiche dans ma fenêtre. Mais genre rien, le vide, le blanc, le néant, je dirais même plus un (void *)NULL !

Après avoir collé des messages de debug partout, je constate que paintEvent n'est jamais appelé (et donc par extension, la surcharge de Update et le display du widget.

Je précise que je n'ai ni warning, ni erreur à la compilation. Les dll sont au bon endroit.

Alors Laurent, est ce que j'ai mal compris le rituel d’invocation de la SFML ? =D

Comme indiqué dans le titre j'utilise la dernière version de la SFML et la QtLib en version 4.8.5. Mon IDE est VS2012 Update 4 et je suis sous Win8.1x64 (avec une CG Ati, si jamais ça à une importance).

EDIT:
QSFMLCanvas.cpp
#ifdef Q_WS_X11
    #include <Qt/qx11info_x11.h>
    #include <X11/Xlib.h>
#endif

#include <iostream>

#include "QSFMLCanvas.hpp"

QSFMLCanvas::QSFMLCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime) :
QWidget       (Parent),
myInitialized (false)
{
    setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_OpaquePaintEvent);
    setAttribute(Qt::WA_NoSystemBackground);

    setFocusPolicy(Qt::StrongFocus);

    move(Position);
    resize(Size);

    myTimer.setInterval(FrameTime);
}

void QSFMLCanvas::showEvent(QShowEvent*)
{
    std::cout << "showEvent" << std::endl;
    if (!myInitialized)
    {
        std::cout << "init" << std::endl;
        #ifdef Q_WS_X11
            XFlush(QX11Info::display());
        #endif

        QWidget::create(winId());

        OnInit();

        connect(&myTimer, SIGNAL(timeout()), this, SLOT(repaint()));
        myTimer.start();

        myInitialized = true;
    }
}

QPaintEngine* QSFMLCanvas::paintEngine() const
{
    return 0;
}

void QSFMLCanvas::paintEvent(QPaintEvent*)
{
    std::cout << "paint" << std::endl;
    OnUpdate();

    display();
}

QSFMLCanvas.hpp
#pragma once
#include <SFML/Graphics.hpp>
#include <Qt/qwidget.h>
#include <Qt/qtimer.h>

class QSFMLCanvas : public QWidget, public sf::RenderWindow
{
public :

    QSFMLCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime = 0);

    virtual ~QSFMLCanvas() {};

private :

    virtual void OnInit() = 0;

    virtual void OnUpdate() = 0;

    virtual QPaintEngine* paintEngine() const;

    virtual void showEvent(QShowEvent*);

    virtual void paintEvent(QPaintEvent*);

    QTimer myTimer;
    bool   myInitialized;
};

MyCanvas.hpp
#include <iostream>

#include "QSFMLCanvas.hpp"

class MyCanvas : public QSFMLCanvas
{
public :

    MyCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size) :
    QSFMLCanvas(Parent, Position, Size)
    {
    }

    ~MyCanvas(void) {}

private :

    void OnInit()
    {
        texture.loadFromFile("logo.png");
        mySprite.setTexture(texture);
    }

    void OnUpdate()
    {
        std::cout << "update" << std::endl;

        clear(sf::Color(0, 128, 0));

        mySprite.rotate(1);

        draw(mySprite);
    }

    sf::Texture texture;
    sf::Sprite mySprite;
};

main.cpp
#include <Qt\qapplication.h>
#include <Qt\qframe.h>

#include "MyCanvas.hpp"

int main(int argc, char **argv)
{
    QApplication App(argc, argv);

    QFrame* MainFrame = new QFrame;
    MainFrame->setWindowTitle("Qt SFML");
    MainFrame->resize(400, 400);
    MainFrame->show();

    MyCanvas* SFMLView = new MyCanvas(MainFrame, QPoint(20, 20), QSize(360, 360));
    SFMLView->show();

    return App.exec();
}
 
« Modifié: Mars 21, 2014, 02:02:41 pm par Toxicat »

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : [SFML2.1 / Qt4.8.5] SFML dans un widget
« Réponse #1 le: Mars 21, 2014, 04:59:17 am »
S'il n'y aucune erreur de compilation, alors peut-être est-ce dans ton code qu'il y a une erreur. Il faudrait que tu post un code minimal, car sinon difficile de répondre.  :P

En passant, si tu veux faire du "GUI" avec SFML, il existe une bibliothèque qui se nomme SFGUI et qui pourrait te sauver de Qt, car pour l'avoir déjà essayer, c'est difficile. (Je préfère Java pour faire du GUI).

Toxicat

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [SFML2.1 / Qt4.8.5] SFML dans un widget
« Réponse #2 le: Mars 21, 2014, 02:04:12 pm »
Voilà, voilà, j'ai édité le premier message ^^

Malheureusement, dans le cadre de ce projet, je suis obligé d'utiliser Qt (pour gérer ma fenêtre) et faire du Java, même pour de la GUI, ne m'intéresse absolument pas =)

Toxicat

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [SFML2.1 / Qt4.8.5] SFML dans un widget
« Réponse #3 le: Mars 23, 2014, 10:44:43 am »
Aha, j'ai trouvé !

Si Laurent passe par là, qu'il sache que je suis disposé à mettre à jour le tuto et/ou en faire un sur le wiki.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2.1 / Qt4.8.5] SFML dans un widget
« Réponse #4 le: Mars 23, 2014, 11:05:55 am »
Commence déjà par nous montrer la solution ici ;)
Laurent Gomila - SFML developer

Toxicat

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [SFML2.1 / Qt4.8.5] SFML dans un widget
« Réponse #5 le: Mars 24, 2014, 10:21:32 pm »
Le problème vient de cette ligne là:

QWidget::create(winId());

Il faut tout simplement écrire:

sf::RenderWindow::create(winId());

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2.1 / Qt4.8.5] SFML dans un widget
« Réponse #6 le: Mars 24, 2014, 10:38:41 pm »
C'est donc plutôt une erreur de ton côté lors du passage de SFML 1.6 à 2.1 ;)

Dans le tutoriel, Create prend un C majuscule, il était donc facile d'en déduire qu'il s'agissait de la fonction de RenderWindow et non de QWidget. C'est encore plus évident lorsqu'on lit les explications qui vont avec ce bout de code dans le tutoriel.

Il n'y a plus de tutoriel d'intégration avec Qt et autres depuis SFML 2, mais tu peux retranscrire une version SFML 2 du tuto sur le wiki, bien entendu.
Laurent Gomila - SFML developer