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();
}