Barre de défilement dans un QGraphicsView

Fermé
Mourad2009B Messages postés 108 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 28 octobre 2024 - 13 déc. 2011 à 18:41
Mourad2009B Messages postés 108 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 28 octobre 2024 - 16 déc. 2011 à 14:16
Bonjour à tous,
voila comme indiquer dans le titre, j'ai défini un QGraphicsView avec QTDesigner, ensuite, j'ai défini une scene, avec les items suivants:

voici le constructeur de ma classe principale


MainWindow2D::MainWindow2D(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow2D)
{
    ui->setupUi(this);
    this->setGeometry(15,5,qApp->desktop()->screen()->width() - 20,  qApp->desktop()->screen()->height() - 330);
    this->setFixedSize(qApp->desktop()->screen()->width() - 20,  qApp->desktop()->screen()->height() - 60);

    ui->verticalLayoutWidget->setGeometry(0,20,this->width(),this->height());
    sceneLegende = new QGraphicsScene(this);
    ui->graphicsViewLegende->setGeometry(0,20,this->width()-20,250);
    

    sceneLegende->setSceneRect(0, 0, ui->graphicsViewLegende->width(), ui->graphicsViewLegende->height());
    
    //Les coordonnées

    //On définit les polices de caractères
    QFont fontTextLegende(QFont("Tahoma",8,12,false));
    QFontMetrics fontMetricsTextLegende(fontTextLegende);


    //On définit les positions et les dimensions
    int intPosRectLegende_x = 10;
    int intPosRectLegende_y = 10;
    int intDimRectLegende_x = 20;
    int intDimRectLegende_y = 10;

    

    int intEcartRectTextLegende_x = 10;
    int intEcartRectTextLegende_y = 10;
    int intPosTextLegende_x = intPosRectLegende_x + intDimRectLegende_x +
            intEcartRectTextLegende_x ;
    int intPosTextLegende_y = intPosRectLegende_y + intDimRectLegende_y/2 -
            fontMetricsTextLegende.width("zzzzzz")/2;




    //Les PEN
    QPen pen(Qt::blue, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);

    //Les rectangles de légende
    
    QPen penRect(Qt::red, 1, Qt::SolidLine);
    QBrush pinceau(Qt::blue);
    //Les titres des légendes
    QFont maFont(QFont("Tahoma",11,12,true));
    QFontMetrics maFontMetrics(maFont);
    QGraphicsItem *itemRectangleLegende, *itemTextLegende;
    

    
    for(int i(0) ; i < 100 ; i++)
    {
        itemRectangleLegende = sceneLegende->addRect(intPosRectLegende_x, intPosRectLegende_y, intDimRectLegende_x, intDimRectLegende_y, pen, pinceau);
        itemTextLegende = sceneLegende->addText(QString("Référence %1").arg(i+1),fontTextLegende);

        intPosTextLegende_x = intPosRectLegende_x + intDimRectLegende_x +
                intEcartRectTextLegende_x ;
        intPosTextLegende_y = intPosRectLegende_y + intDimRectLegende_y/2 -
                fontMetricsTextLegende.height() + 2 ;
        itemTextLegende->setPos(intPosTextLegende_x, intPosTextLegende_y);

        ui->graphicsViewLegende->setScene(sceneLegende);
        ui->graphicsViewGraphe->setScene(sceneGraphe);
        //QMessageBox::information(this, "Titre", QString("intPosRectLegende_y = %1").arg(intPosRectLegende_y));

        intPosRectLegende_y += 15;
        //Cette condition sert à recommencer de tracer les rectangles du début, on se décalant vers la droite, dès qu'on arrive à "sceneLegende->height() - 20"
        if(intPosRectLegende_y >= sceneLegende->height() - 20 )//ui->graphicsView->height() - 15)
        {
            intPosRectLegende_y = 10;
            intPosRectLegende_x += intDimRectLegende_x + intEcartRectTextLegende_x*2 + fontMetricsTextLegende.width(QString("Référence %1").arg(i+1));
        }

    }




ce code sert a dessiner des rectangles l'un au dessous de l'autre, et quand on arrive à la fin on recommence dès le début on ce décalant vers la droite, et ainsi de suite. mon problème est que si le nombre de rectangle est très important, la vue ne me permet pas de les visualiser tous en se servant bien sur de la barre de défilement, j'ai commencer a faire quelques modifications entre les setSceneRect, setGeometry, mais je n'ai pas réussi à le faire.
merci d'avance pour votre aide

2 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
14 déc. 2011 à 04:41
C'est un peu plus compliqué qu'il n'y parait.
Il faut mettre ton 'QGraphicsView' dans un container de type 'QScrollArea' qui va gérer l'affichage avec des ascenseurs automatiques si nécessaire.
Tu devrais avoir un code du style (très simplifié):
  QGraphicsScene scene;
  QGraphicsView view(&scene);
  QScrollArea scrollArea;
  scrollArea.setWidget(&view);
Voir la doc de Qt pour plus d'informations.
Bonne continuation.
0
Mourad2009B Messages postés 108 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 28 octobre 2024
16 déc. 2011 à 14:16
Merci, ça m'aide beaucoup
0