Barre de défilement dans un QGraphicsView

Mourad2009B Messages postés 145 Statut Membre -  
Mourad2009B Messages postés 145 Statut Membre -
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
A voir également:

2 réponses

loupius Messages postés 789 Statut Membre 148
 
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 145 Statut Membre 1
 
Merci, ça m'aide beaucoup
0