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

Discussion :

Un QPainter dans un QScrollArea

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut Un QPainter dans un QScrollArea
    Bonjour !

    Voila, je créée un QPainter pour une lire une image. Ce QPainter m'est utile, car je vais dessiner dedans.
    J'ai incorporé un zoom dans mon programme, mais je ne peux zoomer qu'au milieu de l'image.

    Je voudrais savoir si il est possible de mettre un QScrollArea autour de cette image, ce qui me permettra de pouvoir me deplacer dans l'image lorsque sa taille sera trop importante.

    J'ai reussi à faire la même opération, mais avec un QLabel à la place du QPainter.
    Le problème majeur étant que le QPainter ne dérive pas d'un QWidget.

    Toute aide sera la bienvenu

  2. #2
    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 et bienvenue sur le forum.
    Que représente ton QPainter???

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut
    Merci de ta réponse

    Le QPainter contiendra une image qui sera chargé, et ensuite on pourra dessiner sur cette image.

    J'ai essayer de mettre ce QPainter dans un widget puis d'associer ce widget a un QScrollArea, mais ca ne marche pas !

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut
    Bonjour,

    J'ai toujours le même problème.

    Je n'arrive pas à mettre un dessin dans un QScrollArea. Il se retrouve toujours en arriere plan, même lorsque je le met dans un QLabel et que je joue avec les lower() et raise().

    SI vous avez une idée, je suis preneur !

  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
    une futur QR. Normalement correcte.
    Pourquoi je n'arrive pas à dessiner sur n'importe quels widgets?

    Certaine widgets sont basées sur QAbstractScrollArea dont le but est de permettre l'affichage d'une widget plus grande que sa zone d'affichage.
    En ajoutant des scrollbar par exemple.
    Appliquer un painter directement sur celle-ci n'aura pas l'effet souhaiter.
    Cette class implemente la methode viewport() qui permet d'accéder à la widget qui est réellement affiché. Il faut donc appliquer le painter sur celle-ci.

    Les widgets concernées sont QAbstractItemView, QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, QTextEdit, QTextBrowser,
    QColumnView, QHeaderView, QListView, QTableView, QTreeView,QHelpContentWidget, QTreeWidget, QTableWidget,QHelpIndexWidget, QListWidget, QUndoView,


    voici un exemple utilisant une template pour choisir la class à tester.
    Remarque 1 : le traitement pre-dessin se dessine en arrière plan et peut être totalement effacé par le dessin originel
    Remarque 2 : le traitement post-dessin se dessinera au premier plan


    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
    #include <QtGui>
     
    /* T : class derivant de QAbstractScrollArea*/
    template <typename T>
    class myWidget : public T
    {
    public:
        myWidget(QWidget *parent = 0)
        : T(parent)
        {
            /*créé un second paintEvent pour résoudre certain problème d'affichage 
              dû à l'instant de la création de la widget accede par viewport()*/
            QTimer::singleShot(0,this,SLOT(update()));
        }
     
    protected:
    	void paintEvent(QPaintEvent *event)
        {
           /*pre-dessin*/
            if (this->viewport())
            {
                QPainter painter(this->viewport());
    	        painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    	        painter.drawRect(QRect(10,10,50,50));
            }
     
            /*dessin originel*/
            T::paintEvent(event);
     
            /*post-dessin*/
            if (this->viewport())
            {
                QPainter painter(this->viewport());
                painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
                painter.drawRect(QRect(100,100,50,50));  
            }
            event->accept();
        }
    };
     
    int main(int argc, char **argv) {
    	QApplication app(argc, argv);
        myWidget<QMdiArea> w;	
    	w.show();
    	return app.exec();
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Par défaut
    Bonjour,

    J'ai bien compris la problématique de QPainter et QScrollArea.

    Cependant, y-a-t-il une technique pour contourner cette impossibilité?



Discussions similaires

  1. [Android] Défilement tactile dans un QScrollArea
    Par Daïmanu dans le forum Applications mobiles
    Réponses: 5
    Dernier message: 29/09/2014, 20h34
  2. Problème affichage dans QScrollArea
    Par betsprite dans le forum Débuter
    Réponses: 3
    Dernier message: 04/03/2011, 01h12
  3. Utiliser QPainter dans une grille
    Par lisco dans le forum Qt
    Réponses: 8
    Dernier message: 22/11/2010, 14h13
  4. Dessiner un QWidget dans un QScrollArea
    Par LaLoutre dans le forum Débuter
    Réponses: 2
    Dernier message: 22/06/2010, 11h36
  5. Réponses: 6
    Dernier message: 18/09/2008, 12h35

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