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 :

Positionnement d'un QGraphicsPixmapItem [Graphics View]

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Positionnement d'un QGraphicsPixmapItem
    Bonjour, j'ai un problème avec mon QGraphicsPixmapItem. J'aimerai pouvoir le positionner autrepart qu'au milieu de ma scène, malheureusement, j'ai beau utiliser setPos, il ne veut pas se positionner correctement.

    J'aimerai aussi savoir s'il y avait un moyen de le mettre en haut à droite autrement qu'en utilisant les coordonnées?

    Mon .h:

    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
    #ifndef NOEUXPAPILLON_H
    #define NOEUXPAPILLON_H
    #include <QLabel>
    #include <QGraphicsView>
    #include <QPixmap>
    #include <QGraphicsScene>
    #include <QRect>
    #include <QGraphicsPixmapItem>
     
    class noeuxpapillon: public QGraphicsPixmapItem
    {
    public:
        noeuxpapillon();
        noeuxpapillon (QGraphicsScene *w);
        void ajouter (QGraphicsScene *w);
        void enlever (noeuxpapillon n);
        static int d_nbr;
     
    private:
        static const int max_elt=3;
     
    };
     
    #endif // NOEUXPAPILLON_H
    Mon .cpp

    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
    #include "noeuxpapillon.h"
     
    int noeuxpapillon::d_nbr=0;
     
    noeuxpapillon::noeuxpapillon()
    {}
     
    noeuxpapillon::noeuxpapillon(QGraphicsScene *w)
    {
        this->setPixmap(QString (":/new/prefix1/noeuxpapillon.png"));
        d_nbr++;
        w->addItem(this);
    }
     
     
    void noeuxpapillon::ajouter(QGraphicsScene *w)
    {
     
             noeuxpapillon * n= new noeuxpapillon(w);
             n->setPos(50,50);
     
    }
    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,

    Première remarque sur votre code : avec "void enlever (noeuxpapillon n)", vous allez probablement manipuler une copie et non le pointeur réel, ce qui ne vous conviendra sans doute pas.
    Par rapport à votre question, vous devez faire en sorte que le point (0;0) soit situé non pas au centre de la scène mais au coin en haut à gauche, puis que vous déplaciez l'élément graphique de manière appropriée.
    Ce que je vous propose (non testé - avec scene un QGraphicsScene* et view un QGraphicsView*) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // À l'initialisation :
    scene->setSceneRect(0, 0, view->width(), view->height());
     
    // Pour la création de l'item :
    noeuxpapillon *item = new noeuxpapillon(scene);
    item->setPos(view->width() - item->width(), item->height());
    Si l'on faisait juste setPos(view->width(), 0), le coin en bas à gauche de l'item serait positionné dans le coin en haut à droite de la vue, ce qui ferait qu'il ne serait pas visible, d'où le décalage de -item->width() et de +item->height().

    Bonne journée à vous,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse Louis, malheureusement j'ai quelque soucis. L'item ne s'affiche plus au centre mais légèrement en bas. J'ai réussit à le mettre en haut à droite grâce à n->setPos(view_width*2.6,-view_height*6.8); mais j'ai inclus une option plein écran a mon programme et si je l'active, mon item n'est plus tout en haut à droite. Je précise aussi qu'un QGraphicsPixmapItem n'a pas de méthode width() et height(), je les ai donc recréée à partir de la taille de l'image que j'ai utilisé. J'ai aussi modifié mon constructeur pour mettre la taille de mon QGraphicsView (view_width et view_height).

    Mon .cpp

    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
    #include "noeuxpapillon.h"
     
    int noeuxpapillon::d_nbr=0;
     
    noeuxpapillon::noeuxpapillon():d_width(0), d_height(0)
    {}
     
    noeuxpapillon::noeuxpapillon(QGraphicsScene *w, int view_width, int view_height):d_width(0),d_height(0)
    {
        QPixmap noeuxpapillon (QString (":/new/prefix1/noeuxpapillon.png"));
        this->setPixmap(noeuxpapillon);
        d_width=noeuxpapillon.width();
        d_height=noeuxpapillon.height();
        d_nbr++;
        w->setSceneRect(0,0, view_width, view_height);
        w->addItem(this);    
     
    }
     
    int noeuxpapillon::width()const
    {
        return this->d_width;
    }
     
    int noeuxpapillon::height()const
    {
        return this->d_height;
    }
     
     
    void noeuxpapillon::ajouter(QGraphicsScene *w, int view_width, int view_height)
    {
             noeuxpapillon * n= new noeuxpapillon(w,view_width,view_height); //le 1er
             n->setPos(view_width*2.6,-view_height*6.8);
             //n->setPos(view_width - n->width(), n->height());
     
    }

    Mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    noeuxpapillon *n=new noeuxpapillon();
    n->ajouter(scene, graphicsview->width(), graphicsview->height());

  4. #4
    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
    Bonsoir,

    Effectivement, pour les méthodes width() et height(), j'avais oublié qu'il fallait passer par boundingRect() pour y avoir accès, je donnais les informations de tête. Pour récupérer la scène depuis votre élément, vous pouvez passer par scene(), ce qui vous permettra de ne pas avoir à transmettre vos paramètres.

    Pour le setSceneRect(), il est nécessaire de le faire à l'initialisation de la fenêtre et non à la création de chaque item. En ce qui concerne le changement de taille de la vue, votre QGraphicsView affichant votre scène va recevoir un resizeEvent(), que vous pouvez réimplémenter pour mettre à jour la taille de la scène via setSceneRect() et pour forcer tous les items à être repositionnés.

    Voici un exemple codé rapidement (j'ai utilisé un QGraphicsRectItem au lieu d'un QGraphicsPixmapItem vu que je n'avais pas d'image sous la main, mais c'est sensiblement la même chose) :

    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
    class MyView : public QGraphicsView
    {
        Q_OBJECT
     
    signals:
        void geometryChanged();
     
    protected:
        virtual void resizeEvent(QResizeEvent *e)
        {
            QGraphicsView::resizeEvent(e);
     
            if (scene())
                scene()->setSceneRect(0, 0, width(), height());
     
            emit geometryChanged();
        }
    };
     
    class MyItem : public QObject, public QGraphicsRectItem
    {
        Q_OBJECT
     
    public:
        MyItem(QGraphicsScene &scene)
        {
            QGraphicsView *view = scene.views().first();
     
            setRect(0, 0, 50, 50);
            setBrush(Qt::green);
            setPos(view->width() - boundingRect().width(), boundingRect().height());
     
            scene.addItem(this);
     
            connect(view, SIGNAL(geometryChanged()), this, SLOT(onViewGeometryChanged()));
        }
     
    private slots:
        void onViewGeometryChanged()
        {
            QGraphicsView *view = scene()->views().first();
            setPos(view->width() - boundingRect().width(), 0);
        }
    };
    Et le main() de test :

    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
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        int width = 1280;
        int height = 800;
     
        QGraphicsScene scene;
        scene.setSceneRect(0, 0, width, height);
     
        MyView view;
        view.resize(width, height);
        view.setScene(&scene);
        view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        view.setFrameStyle(QFrame::NoFrame);
     
        MyItem item(scene);
        item.setPos(view.width() - item.boundingRect().width(), 0);
     
        view.show();
     
        return a.exec();
    }
    En testant, je me suis rendu compte que ma formule de décalage était fausse pour la hauteur : 0 et non la hauteur de l'item vu que le référentiel est le point en haut à gauche de l'item et non en bas à gauche, d'où la légère différence avec ce que je vous avais dit plus tôt dans la journée.

    Espérant que cela vous sera utile,
    Bonne soirée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bonjour Louis ^^. Je suis désolé, je crois que je me suis mal exprimé. En ce qui concerne le mode plein écran, l'utilisateur le choisit dans la fenêtre de lancement (fenlancement) et non pas dans dans la fenêtre ou je veux afficher mon item (fenprincipale). Pour cette raison, je ne pense pas que geometrychanged() et resizeevent() me soit vraiment utile (surtout dis moi si j'ai tord). J'ai néanmoins modifier mon code en suivant le reste de ton code et il ne semble pas y avoir vraiment de gros changement.

    La construction de fenprincipale:

    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
    fenprincipale::fenprincipale(QWidget *parent) :
        QWidget(parent)
    {
        this->setWindowIcon(QIcon(":/new/prefix1/icone.png"));
        this->setWindowTitle("Clique le clown");
        this->setStyleSheet("background-color:#FFCD00");
     
        if (fenlancement::plein_ecran)
            this->showMaximized();
        else
        {
            int w=this->width();
            int h=this->height();
            this->setFixedSize(w,h);
        }
     
        positionneur=new QGridLayout(this);
        QVBoxLayout * positionneurv =new QVBoxLayout ();
     
        QGraphicsView * graphicsview = new QGraphicsView(this);
     
        QGraphicsScene * scene = new QGraphicsScene (0);
        graphicsview->setScene(scene);
        scene->setBackgroundBrush(QColor(255, 255, 255));
        scene->setSceneRect(0, 0,graphicsview->width(), graphicsview->height());
     
        QLCDNumber * temps= new QLCDNumber(this);
        temps->setStyleSheet("background-color:white");
        temps->setMaximumSize(80,40);
     
        QLCDNumber * score= new QLCDNumber(this);
        score->setStyleSheet("background-color:white");
        score->setMaximumSize(80,40);
     
        positionneur->addWidget(graphicsview,0,0);
        positionneurv->addWidget(temps,0);
        positionneurv->addWidget(score,1);
        positionneur->addLayout(positionneurv,0,1);
        positionneur->setSpacing(40);
     
        positionneurv->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
     
     
        noeuxpapillon *n=new noeuxpapillon();
        n->ajouter(scene, graphicsview->width(), graphicsview->height());
     
    }

    noeuxpapillon.cpp:

    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
    int noeuxpapillon::d_nbr=0;
     
    noeuxpapillon::noeuxpapillon():d_width(0), d_height(0)
    {}
     
    noeuxpapillon::noeuxpapillon(QGraphicsScene *w):d_width(0),d_height(0)
    {
        QPixmap noeuxpapillon (QString (":/new/prefix1/noeuxpapillon.png"));
        this->setPixmap(noeuxpapillon);
        d_width=noeuxpapillon.width();
        d_height=noeuxpapillon.height();
        d_nbr++;
        QGraphicsView *view = w->views().first();
        setPos(view->width() - boundingRect().width(), boundingRect().height());
        w->addItem(this);    
     
    }
     
    int noeuxpapillon::width()const
    {
        return this->d_width;
    }
     
    int noeuxpapillon::height()const
    {
        return this->d_height;
    }
     
     
    void noeuxpapillon::ajouter(QGraphicsScene *w, int view_width, int view_height)
    {
     
         noeuxpapillon * n= new noeuxpapillon(w); 
        n->setPos(view_width - n->boundingRect().width(), 0);
     
    }

    Un sceenshot en mode petit écran:

    Nom : Capture.PNG
Affichages : 311
Taille : 15,1 Ko

    En plein ecran:

    Nom : Capturepleinecran.PNG
Affichages : 325
Taille : 41,1 Ko

    Bonne journée

  6. #6
    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,

    Je peux faire deux remarques sur votre code :

    • Attention à votre ligne 14 de noeuxpapillon.cpp : la deuxième partie devrait être à 0 et non à boundingRect().height() ;
    • Dans fenprincipale.cpp, ligne 25, vous avez scene->setSceneRect(0, 0,graphicsview->width(), graphicsview->height());. Ce code est appelé avant l'ajout de votre vue à votre layout et avant le setLayout, ce qui fait qu'il n'aura pas la bonne taille à ce moment-là, d'où votre problème, à mon avis. Si cela ne fonctionne pas, en plus des opérations précédentes, essayez dans un premier temps de faire un QCoreApplication::processEvents() pour tester juste après vos show(). Cela forcera le resizeEvent() à se produire et ainsi votre QGraphicsView à avoir la bonne taille. Je pourrai vous proposer une solution sans si cela ne fonctionne qu'avec.

    Bonne journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bonjour, j'ai corrigé les lignes 14 et 25, mais il ne semble y avoir de grosse nouveauté. J'ai aussi ajouté QCoreApplication::processEvents() juste après mon show() dans ma fenêtre de lancement (c'est la première fois que j'utilise cette commande, il est possible que j'ai fait une erreur).

    noeuxpapillon.cpp:

    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
    int noeuxpapillon::d_nbr=0;
     
    noeuxpapillon::noeuxpapillon():d_width(0), d_height(0)
    {}
     
    noeuxpapillon::noeuxpapillon(QGraphicsScene *w):d_width(0),d_height(0)
    {
        QPixmap noeuxpapillon (QString (":/new/prefix1/noeuxpapillon.png"));
        this->setPixmap(noeuxpapillon);
        d_width=noeuxpapillon.width();
        d_height=noeuxpapillon.height();
        d_nbr++;
        QGraphicsView *view = w->views().first();
        setPos(view->width() - boundingRect().width(), 0);
        w->addItem(this);    
     
    }
     
    int noeuxpapillon::width()const
    {
        return this->d_width;
    }
     
    int noeuxpapillon::height()const
    {
        return this->d_height;
    }
     
     
    void noeuxpapillon::ajouter(QGraphicsScene *w, int view_width, int view_height)
    {
     
         noeuxpapillon * n= new noeuxpapillon(w); 
        n->setPos(view_width - n->boundingRect().width(), 0);
    }
    fenprincipale.cpp:

    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
    fenprincipale::fenprincipale(QWidget *parent) :
        QWidget(parent)
    {
        this->setWindowIcon(QIcon(":/new/prefix1/icone.png"));
        this->setWindowTitle("Clique le clown");
        this->setStyleSheet("background-color:#FFCD00");
     
        if (fenlancement::plein_ecran)
            this->showMaximized();
        else
        {
            int w=this->width();
            int h=this->height();
            this->setFixedSize(w,h);
        }
     
        positionneur=new QGridLayout(this);
        QVBoxLayout * positionneurv =new QVBoxLayout ();
     
        QGraphicsView * graphicsview = new QGraphicsView(this);
     
        QGraphicsScene * scene = new QGraphicsScene (0);
        graphicsview->setScene(scene);
        scene->setBackgroundBrush(QColor(255, 255, 255));
     
        QLCDNumber * temps= new QLCDNumber(this);
        temps->setStyleSheet("background-color:white");
        temps->setMaximumSize(80,40);
     
        QLCDNumber * score= new QLCDNumber(this);
        score->setStyleSheet("background-color:white");
        score->setMaximumSize(80,40);
     
        positionneur->addWidget(graphicsview,0,0);
        positionneurv->addWidget(temps,0);
        positionneurv->addWidget(score,1);
        positionneur->addLayout(positionneurv,0,1);
        positionneur->setSpacing(40);
     
        positionneurv->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
     
        scene->setSceneRect(0, 0,graphicsview->width(), graphicsview->height());
        noeuxpapillon *n=new noeuxpapillon();
        n->ajouter(scene, graphicsview->width(), graphicsview->height());
     
    }
    La partie de ma fenêtre de lancement ou j'appelle la fenêtre principale (fenlancement::intro = false):

    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
    void fenlancement::on_Bjouer_clicked()
    {
        if (fenlancement::intro)
        {
            this->close();
            intro_histoire * w=new intro_histoire();
            w->show();
        }
        else
        {
            this->close();
            fenprincipale * i =new fenprincipale();
             i->show();
             QCoreApplication::processEvents();
        }
    }
    Un screenshot en petit écran:

    Nom : Capture.PNG
Affichages : 251
Taille : 22,2 Ko

    Bonne journée

  8. #8
    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,

    Je pensais plutôt à ceci :

    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
        if (fenlancement::plein_ecran)
            this->showMaximized();
        else
        {
            int w=this->width();
            int h=this->height();
            this->setFixedSize(w,h);
            this->show(); // show() en plus pour que l'affichage soit pris en compte dans le processEvents()
        }
     
        // ...
        // (layouts)
        // ...
        positionneurv->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
     
        QCoreApplication::processEvents();
     
        scene->setSceneRect(0, 0,graphicsview->width(), graphicsview->height()); // Ici, les dimensions devraient être correctes
    Est-ce qu'avec cela, c'est mieux ?

    Bonne journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ca marche

    J'ai aussi rajouté ça dans mon .cpp juste après avoir initialisé mon graphicsview afin d'éviter les scrollbars qui sont apparus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    graphicsview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    graphicsview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    graphicsview->setFrameStyle(QFrame::NoFrame);
    Merci beaucoup pour ton aide , elle m'a vraiment été très utile. Je n'ai pas bien compris le QCoreApplication::processEvents() (qui semble portant déterminant). Est ce que tu pourrais me l'expliquer plus en détail?

    Bonne journée

  10. #10
    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 fait, je soupçonnais que le fait de faire un layout nécessite que la fenêtre soit affichée pour qu'il y ait un showEvent() puis un resizeEvent() menant le QGraphicsView à l'intérieur à être redimensionné. Pour cela, vu qu'on est dans le constructeur, on n'a pas envie d'attendre le app.exec() du main (et ainsi de diviser le code dans le constructeur pour les initialisation puis dans une autre fonction appelée par le showEvent() pour la création de la vue, etc.) pour que la fenêtre apparaisse, et on voudrait qu'elle ait tout de suite les bonnes valeurs, bien redimensionnée comme il faut. On force donc le traitement des événements d'affichage et de redimensionnement avec le processEvents().

    En clair, ce qu'il se passait :

    1) Constructeur (la taille du QGraphicsView n'est pas redimensionnée par le layout)
    2) setSceneRect avec la taille incorrecte du QGraphicsView
    3) app.exec() traite les événements, affiche la fenêtre et mène le layout à changer la taille du QGraphicsView

    Ce que l'on fait :

    1) Constructeur
    2) processEvents() pour forcer l'affichage de la fenêtre et mener le layout à changer la taille du QGraphicsView
    3) setSceneRect
    4) app.exec() du main qui n'est plus déterminant pour les étapes précédentes

    Je ne sais pas si c'est très clair, n'hésitez pas à me questionner plus en détail si un détail vous semble obscur.

    Bonne fin de journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour tes explications. Je pense avoir à peu près compris.

    Bonne fin de journée

  12. #12
    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
    Pas de souci, pensez au bouton "Résolu" en bas !

    Bonne soirée à vous,
    Louis

    EDIT : je n'ai rien dit, vous l'avez déjà fait.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

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

Discussions similaires

  1. Déplacement ou positionnement d'une fenêtre
    Par agl dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/11/2003, 09h29
  2. positionnement curseur et code ansi
    Par coach dans le forum C
    Réponses: 7
    Dernier message: 03/11/2003, 23h32
  3. LinCVS - Comment positionner CVSROOT ?
    Par sequentaire dans le forum Réseau
    Réponses: 3
    Dernier message: 10/07/2003, 06h53
  4. RichEdit tjs positionner le curseur en bas du texte
    Par microseb dans le forum C++Builder
    Réponses: 2
    Dernier message: 16/05/2003, 17h48
  5. [TSynMemo] Positionnement par ligne et colonne
    Par Mercilius dans le forum Composants VCL
    Réponses: 9
    Dernier message: 16/04/2003, 16h22

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