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 :

Dessin sur un widget


Sujet :

Qt

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Dessin sur un widget
    Bonjour,

    Mon problème a probablement une solution simple, mais étant débutante, j'arrive pas a la trouver.
    J'ai repris l'exemple d'Image viewer du site de Trolltech, à savoir un widget qui hérite de QMainWindow et qui contient une QScrollArea affichant une image au moyen d'un QLabel.
    Ce que je voudrais, c'est pouvoir afficher, lors d'un clic, une croix ou rectangle à l'emplacement du curseur. A chaque nouveau clic cette marque doit changer de position, au lieu de se multiplier. De plus l'image en dessous ne doit pas etre modifiée.

    Dans mon idée il faudrait avoir une sorte de "calque" transparent par dessus l'image sur lequel le dessin va se faire. Mais je ne sais pas trop quel widget peut me servir de calque, ni de quelle manière l'ajouter à ma fenetre, sachant que QScrollArea n'accepte apparamment qu'un seul widget.

    Merci pour toute aide!!

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il suffit de créer un widget au-dessus de l'autre widget, celui qui a le dessin, par exemple, et de déplacer la croix sur ce widget placé au-dessus.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Hm.. justement, le type de widget à ajouter me pose problème.

    voici le code d'origine (repris à la lettre de l'exemple Image Viewer):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            imageLabel = new QLabel;
    	imageLabel->setBackgroundRole(QPalette::Base);
    	imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    	imageLabel->setScaledContents(true);
     
    	scrollArea = new QScrollArea;
    	scrollArea->setBackgroundRole(QPalette::Dark);
    	scrollArea->setWidget(imageLabel);
     
    	setCentralWidget(scrollArea);
    L'image est donc dessinée via la fonction open() dans le QLabel.

    Je viens d'essayer d'ajouter le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	imageLabel2 = new QLabel;
    	imageLabel2->setBackgroundRole(QPalette::NoRole);
    	imageLabel2->setPixmap(QPixmap("data/images/transparent.png"));
     
    	scrollArea2 = new QScrollArea;
    	scrollArea2->setBackgroundRole(QPalette::NoRole);
    	scrollArea2->setWidget(imageLabel2);
    en mettant NoRole pour obtenir de la transparence, mais malgré tout j'ai pas l'affichage de la premiere scrollArea...
    de plus, il me parait lourd tout ce code.. il y aurait un autre moyen d'ajouter un QImage ou QPixmap ou QLabel au dessus de ma scrollArea?

    merci

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Pour ajouter, j'ai essayé de redéfinir le paintEvent() au sein du widget ImageViewer, ce qui me parait une méthode assez pratique vu qu'en 2 lignes je peux donner l'image que je veux afficher (la petite croix par exemple) et son emplacement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     void ImageViewer::paintEvent(QPaintEvent * /* event */)
     {
         QMainWindow::paintEvent( event );
         QPainter painter(this);
         painter.drawImage(QPoint(monPoint), "data/images/transparent.png"); 
     }
    mais quand je donne this en argument au painter il dessine autour de la scrollArea (sur le status bar et le menu), ce qui est plutot normal. Et si j'essaye de lui donner scrollArea, j'ai une erreur à l'exécution:

    QPainter::begin: Widget painting can only begin as a result of a paintEvent

    voilà, si jamais vous avez une solution dans ce sens là, au lie de superposition de widgets.
    merci ^^

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Place un widget au-dessus de ton imageviewer, comme je te l'ai indiqué...

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour

    J'ai réussi à faire je pense qlq chose de très similaire.
    Je charge une image png/jpg/... et je dessine dessus sur un calque transparent.
    Et je peux récupérer uniquement mes dessins sur un QImage.

    Le code n'a rien de compliqué, mais ca aidera surement d'autres débutants

    Juste une remarque: le #define SLOW qui traine dans le code est pour utiliser une QPixmap au lieu d'un QImage comme calque de dessin afin d'avoir qlq chose de plus rapide. Cependant la ligne
    _painting->fill(QColor(Qt::transparent)); pose problème puisque une fois excutée, les dessins ne s'affichent plus.

    Si qlq'un peut m'éclairer sur ce point qui reste sans réponse.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. dessiner sur une widget
    Par lastrecrue dans le forum Qt
    Réponses: 2
    Dernier message: 17/11/2008, 09h25
  2. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06
  3. Dessiner sur un Tbutton
    Par rvzip64 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/06/2004, 09h06

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