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

Qt Discussion :

Qt4 SDL widget transparent


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut Qt4 SDL widget transparent
    Bonjour à tous,

    Après avoir lu de très nombreux post et faq, je m'en remet à vous :

    Je veux créer une console sous forme d'une zone de dessin SDL intégrée à un widget Qt :

    1. Je crée mon widget, récupère l'ID de la fenetre, initialise Qt
    2. Je règle les options de dessin de Qt pour pouvoir effectuer un rendu dans mon QWidget
    3. Je veux juste remplir mon rectangle de blanc, et là ca ne fonctionne pas

    Voici la classe de mon widget :
    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
     
    #ifndef SDLCONSOLETHREAD_H
    #define SDLCONSOLETHREAD_H
     
    #include <QWidget>
    #include <QThread>
    #include <SDL/SDL.h>
    #undef main
     
    class SDLConsoleThread : public QThread, public QWidget
    {
    Q_OBJECT
    public:
    	SDLConsoleThread(QWidget *parent = 0);
    	~SDLConsoleThread();
     
    	virtual void run();
     
    private slots:
    	virtual void paintEvent ( );	
     
    private:
     
    	char windowid[64]; // To get Window environment to place the SDL window
    	SDL_Surface *screen;  // Display area for the SDL window
    };
     
    #endif
    Et son implémentation :

    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
     
    #include "sdlconsolethread.h"
     
    SDLConsoleThread::SDLConsoleThread(QWidget *parent)
    	: QWidget(parent)
    {
    	// Setting QWidget paint settings to autorize direct rendering into the widget
    	setAttribute(Qt::WA_PaintOnScreen);
    	setAttribute(Qt::WA_NoSystemBackground);
     
    	// Setting QWidget Size
    	setMinimumSize ( QSize(400,100) );
     
    	// Getting window environment
    	sprintf(windowid, "SDL_WINDOWID=0x%lx", winId());
    	// Setting SDL environment
    	SDL_putenv(windowid);
    	// Initialisation of SDL
    	if( SDL_Init( SDL_INIT_VIDEO  ) == -1 )
    	{
    		printf( "Can't init SDL:  %s\n", SDL_GetError( ) );
    	}
    	atexit(SDL_Quit);
     
    	screen = SDL_SetVideoMode( width(),height(), 32, SDL_HWSURFACE );
     
    	if( screen == NULL )
    	{
    		printf( "Can't set video mode: %s\n", SDL_GetError( ) );
    	}
     
    }
     
     
    SDLConsoleThread::~SDLConsoleThread()
    {
    	qDebug( "Console Thread Exited Normally" );
    	SDL_FreeSurface( screen );	
    	SDL_Quit();
    }
     
    void SDLConsoleThread::run()
    {
    // 	while( true )
    // 	{
    // 		SDL_Event event;
    // 		if (SDL_PollEvent (&event) && event.type==SDL_QUIT)
    // 			break;
    // 	}
    }
     
    void SDLConsoleThread::paintEvent ()
    {
    	SDL_FillRect( screen, 0, 0 );
    	SDL_Flip( screen );
    }
    Je ne vois vraiment pas pourquoi mon widget n'est pas peint :/ (en noir en l'occurence ici SDL_FillRect( screen, 0, 0 ) mais ce n'est pas le pb)

    Si qqun voit la solution ca serait vraiment sympa de m'aider.

    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,

    Je te conseille assez fortement de lire ce tuto et le code qui l'accompagne (j'espère qu'on ne m'en voudra pas de ne pas mettre un lien DVP :/)

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    Salut,

    C'est justement le premier que j'ai lu et celui sur lequel je me suis basé pour créer mon widget.
    La solution n'est malheureusement pas dedans

  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
    Hé bien si... puisque ça marche. Après c'est peut-être pas super expliqué, et je vois déjà un problème à corriger

    Primo, regarde où tu indiques à SDL l'id de fenêtre à utiliser, et regarde où je le fais. La raison est que dans le constructeur, la fenêtre n'existe pas et l'id est donc invalide. *boum* pas d'affichage possible.

    2: corrolaire du 1: regarde où je fais l'initialisation de la SDL

    3: tu utilises SDL_Flip à tort. J'utilise SDL_UpdateRect parce qu'il n'y a pas de double buffer, tu devrais faire de même pour commencer, puis n'utiliser SDL_Flip que si tu as demandé un double buffer.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    salut.
    class SDLConsoleThread : public QThread, public QWidget
    Pourquoi hérite tu de QThread???

  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
    Citation Envoyé par Mongaulois Voir le message
    Pourquoi hérite tu de QThread???
    Oula oui, je l'avais carrément zappé ce point, bien vu

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

Discussions similaires

  1. [QT4] Tree Widget personnalisé
    Par Mic75 dans le forum Qt
    Réponses: 4
    Dernier message: 28/10/2008, 10h57
  2. Transparence fenetre SDL
    Par Kevvv dans le forum SDL
    Réponses: 4
    Dernier message: 15/05/2007, 21h18
  3. SDL et Qt4.2
    Par Sleeping Lionheart dans le forum Qt
    Réponses: 17
    Dernier message: 01/05/2007, 16h38
  4. [SDL] Lenteur d'exécution avec transparence
    Par Invité4 dans le forum SDL
    Réponses: 27
    Dernier message: 08/07/2006, 17h03

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