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 :

QGraphicsScene/View et QSvgWidget


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 22
    Points
    22
    Par défaut QGraphicsScene/View et QSvgWidget
    Bonjour tout le monde!

    J'apprends actuellement à "dessiner" avec Qt et, malgré mon expérience avec le framework, je me heurte à un certain nombre de problèmes.

    Mon objectif est de réaliser un horizon virtuel comme on peut en voir dans les avions:
    Nom : 1024px-Artificial_horizon.svg.png
Affichages : 539
Taille : 168,6 Ko

    Bien sûr, le miens sera beaucoup plus joli!

    Je suis finalement parvenu à afficher l'horizon et le ciel tout en gérant le redimensionnement de la fenêtre (ce qui n'a pas été simple), mais lorsque je souhaite ajouter un .svg représentant mon avion, celui-ci ne s'adapte pas au redimensionnement de la fenêtre. Voici pour le moment le résultat que j'obtiens:
    Nom : capture1.jpg
Affichages : 450
Taille : 86,4 Ko
    Ici, j'ai fais la capture après avoir redimensionné la fenêtre. Au départ, l'avion est bien centré.
    Le code que j'ai utilisé pour cela est le suivant:

    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 "vue.h"
    #include "iostream"
     
    Vue::Vue()
    {
        view = new QGraphicsView(this);
        scene = new QGraphicsScene(this);
        plane = new QSvgWidget(":/res/img/avion.svg", view);
     
        resize(WINDOW_WEIGHT, WINDOW_HIGHT);
        scene->setSceneRect(0, 0, WINDOW_WEIGHT, WINDOW_HIGHT);
        drawPlane();
        drawSky();
        view->setScene(scene);
        view->show();
        view->installEventFilter(this);
        setCentralWidget(view);
    }
     
    void Vue::drawSky()
    {
        QPainterPath PathSky;
        QRect rectSky(0, 0, WINDOW_WEIGHT, WINDOW_HIGHT/2);
        QPen penSky(QColor(116, 208, 241), 1, Qt::SolidLine);
        QBrush brushSky(QColor(116, 208, 241));
        PathSky.addRect(rectSky);
        scene->addPath(PathSky, penSky, brushSky);
     
        QPainterPath PathGround;
        QRect rectGround(0, WINDOW_HIGHT/2, WINDOW_WEIGHT, WINDOW_HIGHT);
        QPen penGround(QColor(181, 121, 33), 1, Qt::SolidLine);
        QBrush brushGround(QColor(181, 121, 33));
        PathGround.addRect(rectGround);
        scene->addPath(PathGround, penGround, brushGround);
    }
     
    void Vue::drawPlane()
    {
        plane->move(WINDOW_WEIGHT/3, WINDOW_HIGHT/3);
        plane->resize(this->size().width()/3, this->size().height()/3);
        plane->renderer();
    }
     
    void Vue::resizeEvent(QResizeEvent *event)
    {
        view->fitInView(0, 0, scene->width(), scene->height());
        QWidget::resizeEvent(event);
        plane->renderer();
    }
     
    void Vue::showEvent(QShowEvent *event)
    {
        view->fitInView(0, 0, scene->width(), scene->height());
        QWidget::showEvent(event);
    }
    Ma question est donc double:
    1 - Pourriez-vous me confirmer que la façon dont je m'y prend pour "dessiner" est le bonne?
    2 - Comment dois-je m'y prendre pour que mon fichier .svg suive les transformations de la fenêtre?

    Merci d'avance!

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    En regardant votre code, on note que votre avion ne fait pas partie de votre scène, il est situé dans la vue (il y a réellement une nuance, d'où les problèmes de redimensionnement et de positionnement). Si vous voulez l'intégrer dans la scène, je vous suggère de passer par un addWidget() de QGraphicsScene :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QGraphicsProxyWidget *plane = scene.addWidget(new QSvgWidget(":/res/img/avion.svg"));
    Un autre point : le fait d'appeler plane->renderer() ne fait que retourner le pointeur vers le QSvgRenderer, cela n'a aucun effet. Si vous souhaitez forcer le redraw du SVG, passez plutôt par update(). Cependant, cet update sera appelé automatiquement par un appel à plane->setGeometry() ou plane->resize().

    Qu'en est-il avec cela ?

    Bonne journée,
    Louis

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/02/2004, 19h14
  2. [SYBASE] Insert sur view
    Par P'tit Jean dans le forum Sybase
    Réponses: 4
    Dernier message: 31/10/2003, 12h21
  3. Tree View avec XML et XSL
    Par Drooxy dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/04/2003, 10h21
  4. Réponses: 6
    Dernier message: 21/06/2002, 14h48
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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