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

  1. #1
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    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
    Points : 3 266
    Points
    3 266
    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 régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    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
    Points : 3 266
    Points
    3 266
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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
    Points : 3 266
    Points
    3 266
    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

  7. #7
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Salut !

    Merci pour ton aide. J'ai repris ton tuto à la lettre, et ce qu'il me manquait (le flip et le paintEvent étaient le résultat de nombreux tests intermédiaires) c'était la connexion avec le timer pour déclencher onRefresh. Cependant, n'y a-t-il pas un moyen de déclencher l'affichage du Widget en utilisant un évènement du widget prédéfini par Qt ?

    D'autre part, je faisais hériter mon widget de la classe QThread pour pouvoir gérer la pile d'évènement SDL à part de celle de ma fenetre générale. Cependant je me suis rendu compte que moc ne supportai pas l'héritage multiple de classes héritée de QObject, et donc connect ne fonctionne pas. Y'a-t-il un autre moyen de gérer les évènements de la console SDL pour qu'ils n'interfèrent pas avec le reste des évènement de la fenêtre ?

    Merci,

  8. #8
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par manpe Voir le message
    Merci pour ton aide. J'ai repris ton tuto à la lettre, et ce qu'il me manquait (le flip et le paintEvent étaient le résultat de nombreux tests intermédiaires) c'était la connexion avec le timer pour déclencher onRefresh. Cependant, n'y a-t-il pas un moyen de déclencher l'affichage du Widget en utilisant un évènement du widget prédéfini par Qt ?
    Ben... tu pourrais le mettre dans paintEvent et appeller update() lorsque tu veux redessiner. J'ai utilisé un timer parce que le code était une animation, pas une image fixe. En fait, en utilisant la SDL tu te dégages des restrictions que Qt pose quant au dessin sur le widget... puisqu'en fait tu ne dessines pas sur le widget, mais sur une surface en overlay.

    Citation Envoyé par manpe Voir le message
    D'autre part, je faisais hériter mon widget de la classe QThread pour pouvoir gérer la pile d'évènement SDL à part de celle de ma fenetre générale. Cependant je me suis rendu compte que moc ne supportai pas l'héritage multiple de classes héritée de QObject, et donc connect ne fonctionne pas. Y'a-t-il un autre moyen de gérer les évènements de la console SDL pour qu'ils n'interfèrent pas avec le reste des évènement de la fenêtre ?
    Si, les intégrer à l'eventLoop de Qt en implémentant une classe genre SDLApplication dérivant de QApplication comme il faut. Mais c'est pas à la portée du premier venu. Pourquoi veux-tu les utiliser?

  9. #9
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Salut !

    Merci pour le "premier venu".

    J'ai separe mes 2 classes SDLWidget qui herite de QWidget et SDLThread qui herite de QThread, avec les bonnes synchronizations (mutex et wait), et une connection "queued" entre un signal du Thread general et un slot de mon SDLThread qui controle l'affichage du SDLWidget, tout fonctionne !

    En fait je developpe un environnement de test "intuitif" pour une application 3D OpenGL que je developpe avec 2 amis qui s'occupent de la partie "graphique" et qui ne connaissent pas grand chose a la programmation.
    L'application reprend un canvas traditionnel : menu qt a gauche, console SDL en bas, fenetre OpenGL au centre.

    La console "SDL" c'est vraiment pour toucher au SDL et repondre aux problemes que j'ai deja souleve plus tot, car c bcp plus rapide et efficace avec un widget QTextEdit en mode LogViewer.

  10. #10
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par manpe Voir le message
    Merci pour le "premier venu".
    Rah, ces gens qui sont susceptibles alors que c'est des expressions communes... J'aurais dû dire que c'est une tâche assez complexe, et sans accès aux solutions Qt commerciales, c'est très dur d'improviser la solution. C'est mieux dit là?

    Citation Envoyé par manpe Voir le message
    En fait je developpe un environnement de test "intuitif" pour une application 3D OpenGL que je developpe avec 2 amis qui s'occupent de la partie "graphique" et qui ne connaissent pas grand chose a la programmation.
    Euh... Si j'ai bien compris: pourquoi ne pas utiliser directement un QGLWidget? Tu n'as pas l'air d'avoir besoin de spécifité SDL, si?

  11. #11
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Si j'ai bien compris: pourquoi ne pas utiliser directement un QGLWidget? Tu n'as pas l'air d'avoir besoin de spécifité SDL, si?
    Non en effet SDL n'est pas indispensable, c'est pour ca que j'ai ecrit dans le message precedent :

    La console "SDL" c'est vraiment pour toucher au SDL et repondre aux problemes que j'ai deja souleve plus tot, car c bcp plus rapide et efficace avec un widget QTextEdit en mode LogViewer
    C'est en effet mieux dit :

    Rah, ces gens qui sont susceptibles alors que c'est des expressions communes... J'aurais dû dire que c'est une tâche assez complexe, et sans accès aux solutions Qt commerciales, c'est très dur d'improviser la solution. C'est mieux dit là?

+ 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