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 :

Item se déplaçant dans la scène


Sujet :

Qt

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 109
    Points : 48
    Points
    48
    Par défaut Item se déplaçant dans la scène
    bonjour,

    Je realise une application permetant de visualiser des "sort" d'histogramme dans une qgraphicview.
    J ai plusieur million de bars histogramme donc je ne veux pas tous les charger en meme temp dans ma scene.

    J ai donc reimplementer une class myScene avec une capture de mouseeventmove, j ai fait un essai avec quelque histogramme et c est parfait ils se deplacent de gauche a droite.

    PB si je depasse de la taille du widget qui contient ma scene, la scene augmente de taille. ( dans la doc de qt il est indiquet quelle me peux que croitre).J ai lu sur des forum qu il fallait gere les itemes avec leur posisiton au cas ou un item voudrais sortie de la zone visible.

    C est ok seulement si je connais la taille de mon widget qui contient mon qgraphicview qui contient ma scene (les 2 premiers ou toujours la meme taille) MAis si je resize mon application la taille du widget change celle du qgraphicview aussi par le biais des layout,

    L ui est cree avec Creator

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class GraphicsScene:public  QGraphicsScene
    {
            Q_OBJECT
    public:
     
        GraphicsScene(QObject *parent = 0);
        virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * mouseEvent ) ;
     
    };
    Bar est en item custom

    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
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
     
     
           scene =  new GraphicsScene(this);
           ui->graphicsVieW->setScene(scene);
     
           for(int i =0;i<10;i++)
           {
           Histo*bar=new Histo;
           bar->setValues(10,40,70,4);
           bar->setPos(50+i*10,20+i*5);
           scene->addItem(bar);
           }
     
    }
     
    void MainWindow::on_pushButton_clicked()
    {
           qDebug()<<ui->graphicsVieW->height ();
           qDebug()<<ui->graphicsVieW->width ();
           qDebug()<<ui->fwidget->height();
           qDebug()<<ui->fwidget->width();
           qDebug()<<scene->sceneRect().height();;
           qDebug()<<scene->sceneRect().width();;
           qDebug()<<scene->height();;
           qDebug()<<scene->width();;
     
    }
    Docn ici le PB est que dans iteme j ai pas acces a ui->fwidget->height() ou a ui->graphicsVieW->height ().

    je voie pas trop comemnt m en sortir.
    merci!

  2. #2
    Membre averti

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Points : 398
    Points
    398
    Par défaut
    view()->viewport()->rect() te renverra la zone de rendu de ta scene, à transformer dans le bon repère de coordonnées (mapToScene par exemple)

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 109
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Desoler mais je voie pas, je suis dan sle brouillard

    je suppose que view est un pointeur pour le QGraphique view

    Or j ai definie le Qgraphique view avec le creator. donc j y ai acced seulement depuis la mainwindows
    alors oui :
    ui->graphicsVieW->viewport()->rect().x(); me donen bien les coordonne mais je ne voie pas trop comment le deplacement des mes item qui ce fait dans Ma GraphicsScene (scene) pourront ete informe de ce que leur parent fait.

    du coup je voie moyen la differance avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          qDebug()<<ui->graphicsVieW->height ();
           qDebug()<<ui->graphicsVieW->width ();
           qDebug()<<ui->fwidget->height();
           qDebug()<<ui->fwidget->width();
    merci

  4. #4
    Membre averti

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Points : 398
    Points
    398
    Par défaut
    Salut,

    en fait j'avais lu en diagonale et répondu rapidement en espérant que ça te débloque, cependant je confirme que même après relecture je ne comprends pas ton problème. Pourrais-tu ré-expliquer ce que tu veux faire ?

    En utilisation normale, on fait comme ceci :

    - On construit le QGraphicsScene avec les données des objets qu'on veut voir (tous les objets). Cela se fait en ajoutant des QGraphicsItem à la scene.

    - Ensuite la QGraphicsView se charge de visualiser, de n'afficher à l'écran que les items visibles, tout ça est géré par QT.

    Il n'y a normalement pas de raison d'intervenir sur la scene en fonction de la taille du viewport (sauf cas particuliers ou problèmes de perfs). As-tu essayé avec tes millions de bars de manière classique, avant d'essayer d'optimiser ?

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 109
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Ce n est pas vraiment pour une question de perf mais plutot d espace memoire.

    Je n ai pas essaye de charger touts les items et voila pourquoi.

    je m explique j ai les aquisitions de plusieur capteurs. cela represente environ 1go de donnees par capteur, j utilise ces donnes pour faire des simulation/calcul donc pour une question evidente de perf ces donne sont en memoire.

    Maitenant, en meme temp je veux pouvoir visualiser ces donnes( et d autre donne qui sont liee a chaque acquisition), si je charge tout les item graphique ( qui sont constitue des meme donnes que celle de mes capteur) cela revient a tout charger 2 fois en memoire. 1 go par capteur environ 1 go pour la simulation en elle meme. Meme avec une machien de 12go je doit faire attention.

    docn je veux faire une manager d'item dans la scene en supprimant ou ajoutant ceux qui entre et sort du view( visible). Ainsi j aurait aux max 200 500 bar.

    Pour cela j ai reimplementer un graphicsScene. Mais je suis en train de me demander( et d essayer ) de reimplementer un Widget (manager d item) qui lui contiendrai un graphicview et une scene et si je ne devrai pas implementer les mouseEvent dasn mon "Widgetmanager" plutot que dans ma class GraphicsScene.

    En esperant avoir ete plus clair.

    Merci

    .

  6. #6
    Membre averti

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Points : 398
    Points
    398
    Par défaut
    Mouais dans ce cas c'est plus compliqué en effet, surtout que même une machine de 12Go ne règlera pas ton problème car tu seras limité à 3Go voire 4Go dans le meilleur des cas, à moins que tu ne compiles en 64bits...

    Du coup je ne sais pas si QGraphicsScene est le meilleur choix en effet...

    Pour afficher des données capteurs, trends ou autres il y a Qwt qui est une lib d'affichage de graphiques qui te conviendrait peut-être.

    Ensuite pour le problème d'échelle, je pense qu'il faudrait générer des sets de datas à différentes échelles justement. Je m'explique, si tu as disons 1 millions de points de mesures à afficher et que tu veux voir toute la fenêtre, il est inutile d'afficher le millions de mesure alors que l'écran fait 1000 pixels de large. L'idée est d'avoir ton buffer de donnée original plus d'autre buffers plus petits, moyennés. En imagerie on appelle ça une pyramide, à chaque niveau on divise la résolution par deux, en fonction du niveau de zoom on choisi le niveau de pyramide à utiliser pour le display.

Discussions similaires

  1. placement d'objets dans la scène
    Par bonofred dans le forum OpenGL
    Réponses: 5
    Dernier message: 29/06/2007, 13h31
  2. Détection des séquence d'adultes dans des scénes vidéo
    Par karima1010 dans le forum Traitement d'images
    Réponses: 37
    Dernier message: 03/05/2007, 16h39
  3. Déplacement / zoom dans une scène
    Par foruma dans le forum Flash
    Réponses: 4
    Dernier message: 15/11/2006, 10h57
  4. Creér des Clip dynamiquement dans la scène
    Par jpboogie dans le forum Flash
    Réponses: 2
    Dernier message: 04/10/2006, 16h47
  5. Réponses: 1
    Dernier message: 11/05/2005, 17h28

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