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 :

Dessiner un QWidget sur buffer


Sujet :

Qt

  1. #1
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut Dessiner un QWidget sur buffer
    Bonjour,

    ma question va paraitre bizarre, mais je n'ai pas trouvé ça ailleurs.
    Est il possible de "dessiner" des composants Qt, style QLabel, QPushButton,... sur un buffer récupérable par un autre programme qui utilise simplement ce buffer pour le dessiner à l'écran?

    Si ce n'est pas possible directement, je supposais qu'une simple capture d'écran du composant, après création et affichage, pouvait former ce buffer utilisable ailleurs mais je redoute des problèmes de rapidité et de performances suite à cette technique.

    Si vous avez la moindre idée, je suis preneur.
    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Pas compris ... Ton but est d'inclure des "photo" d'items Qt sur une image?

    Ou tu veux ajouter des items Qt sur une scene 3D ?

    Je ne comprends pas ce que tu entends par "buffer". Pourrais tu etre plus précis ? des faux screenshots seraient les bienvenues .

    G.

  3. #3
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    oui lol c'est pas clair je m'en doutait.

    Je voudrais faire une sorte de bibliothèque de ... composants Qt :
    Concrètement, je suis dans un programme Ma_Qt_Bibliothèque qui charge une dll qui elle lui fournit les images des composants Qt dessinés.

    Après le but c'est de disposer de plusieurs dll de différentes bibliothèques perso fournissant différents styles de même composants Qt MAIS juste le dessin du composant avec le style voulu.

    Pour gérer les styles, je redéfinirais un proxy sur QStyle mais seulement si je peux au moins avoir ces composants Qt sur mémoire pour les réutiliser ailleurs...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Ok, je vois un peu mieux ce que tu veux faire. Je ne peux pas vraiment t'aider, car je n'ai aucune idée.

    As tu regardé l'exemple fourni "Embedded Dialogs" ? (dans qtdemo). Les widgets sont "actives" dans cet exemple, mais il y a un rendu dans un QGraphicsView qui peut peut être ressembler à ce que tu veux faire.

    Bonne chance,

    G.

  5. #5
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    Effectivement, j'ai testé et l'idée est là, mais ici c'est un form UI qui est embarqué et recopié et affiché en série dans le QGraphicsView.

    Cependant l'objet QGraphicsProxyWidget est intéressant.
    Je vais regarder s'il n'y a pas une méthode héritée qui permet de passer tout ça en ByteArray ou QByteArray, ou alors peut être passer par le QDataStream...

    En tout cas merci pour l'info, ça me donne une piste!

  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
    Salut,

    Tu peux créer un QImage (créer avec la taille du widget à rendre, cf sizeHint(), ainsi que le format d'image que tu préféres (ARGB32 etc...)), puis utiliser la fonction QWidget::render qui prend un QPaintDevice en paramètre.
    De là, tu peux accéder au buffer de l'image (gaffe au padding des lignes) que le programme principal peut lire si tu lui passes les infos nécessaires (résolution et format).

  7. #7
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    ça marche! (même j'ai mis du temps à voir que QImage et QPixmap héritaient de QPaintDevice)

    Merci IrmatDen !!!

    Voici le code pour ceux que cela intéresse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // déclaration de mon widget dans le constructeur de la MainWindow
    // QPushButton *pushButton = new QPushButton(tr("My Push Button"),this);
    // QLabel label = new QLabel("My Label", this);
     
    // récupération du rendu sur buffer QImage
    QImage image(pushButton->size(), QImage::Format_ARGB32);
    pushButton->render(&image);
     
    // Affichage pour vérifier dans un QLabel en passant par un QPixmap
    QPixmap imageContainer = QPixmap::fromImage(image);
    label->setPixmap(imageContainer);
    Par contre, j'ai dû utiliser QWidget->size() et non pas QWidget->sizeHint() car la seconde méthode coupe la partie droite de mon widget contrairement à size().
    Encore 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
    Par défaut
    Ah, mais si c'est pour afficher avec un QPixmap, tu peux davantage te faciliter la vie en utilisant QPixmap::grabWidget(..)

  9. #9
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    non non là c'était juste pour tester !
    je vais vraiment utiliser ça après dans un buffer envoyé à une application C++ classique.
    D'ailleurs j'ai supposé que ce buffer sera acquis avec QImage::bits()...

  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
    Par défaut
    Oui, c'est ça

  11. #11
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    Bonjour,
    j'ai un problème en utilisant ce buffer depuis la QImage:
    QWidget: Must construct a QApplication before a QPaintDevice

    Dans ma dll Qt je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // avec extern C
    QTSHAREDLIBRARYSHARED_EXPORT unsigned char * getWidgetRender() {
     
        QPushButton pushButton("PushButton");
        QImage image(pushButton.size(), QImage::Format_ARGB32);
        pushButton.render(&image);
     
        return image.bits();
    }
    Dans mon application principal je fais un loadLibrary (sur Windows avec Visual C++ 6.0)...tout cela fonctionne mais au lancement du programme cela donne le message d'erreur lors de l'utilisation de la fonction qui devrait me retourner le rendu du QWidget.

    J'ai trouvé sur le net que cela pourrait être un problème de Debug/Release mais j'ai essayé de tout mettre en release cela ne change pas l'erreur.
    Cela pourrait aussi être un problème de static? Mais rien n'est static dans ma dll ni mes fonctions. Peut être justement devrais je rendre static les éléments de ma dll Qt qui renvoi le rendu du graphique?!

  12. #12
    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
    Si tu n'as pas de QApplication, tu peux abandonner cette approche, y compris l'instanciation de widgets...

  13. #13
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    J'ai quand même essayé de créer un faux QApplication mais sans succès.
    Je pensais qu'on pouvait créer des QWidgets dans une bibliothèque dynamique?
    Je devrais alors peut être charger dans cette dll un plugin contenant l'instanciation des widgets...

  14. #14
    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
    Je sais pas ce que tu fais comme usine à gaz, mais tu as probablement plus intérêt à avoir une appli Qt à part (non visible, mais que tu dois t'assurer de piloter correctement), et faire de l'IPC pour obtenir des rendus de widget, et ordonner lesdits rendus et le fait de quitter.

  15. #15
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    Effectivement, on peut (et on doit) créer un QApplication qui ne sert à rien d'autre que pouvoir créer nos widgets. J'avais mal réglé ses paramètres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int argc = 1;
    char** argv = NULL;
    QApplication a(argc, argv);
     
    QPushButton pushButton("PushButton");
    QImage image(pushButton.size(), QImage::Format_ARGB32);
    pushButton.render(&image);
     
    return image.bits();
    Encore merci.

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

Discussions similaires

  1. Dessiner en cliquant sur un bouton
    Par had182 dans le forum MFC
    Réponses: 4
    Dernier message: 22/01/2006, 21h26
  2. Dessiner un DIB sur un TForm ou TPanel
    Par Neilos dans le forum C++Builder
    Réponses: 6
    Dernier message: 14/11/2005, 23h46
  3. Dessiner un rectangle sur une forme
    Par Neo41 dans le forum MFC
    Réponses: 6
    Dernier message: 13/08/2005, 01h08
  4. Dessin à la volée sur composant transparent
    Par orelero dans le forum 2D
    Réponses: 1
    Dernier message: 28/07/2005, 17h12
  5. Réponses: 3
    Dernier message: 29/06/2005, 14h29

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