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 :

Gestion des QScrollArea et ajout d'éléments


Sujet :

Qt

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Par défaut Gestion des QScrollArea et ajout d'éléments
    Bonjour,

    Programmant sous QtCreator, je souhaite faire en sorte que l'utilisateur puisse sélectionner, dans un premier temps, un seul répertoire.
    Puis, si nécessaire, il peut cliquer sur un bouton afin d'ajouter un bouton et un champs permettant l'affichage du second répertoire choisie.

    Cependant, et c'est là que viens ma question, si l'utilisateur ajoute assez de champs pour que ceux-ci viennent à se "cacher" en dehors du Frame, ou encore à venir chevaucher les autres frames,
    je souhaiterais qu'une barre de défilement s'affiche permettant de descendre vers le contenu caché.

    J'ai donc essayé d'insérer mes éléments dans un QScrollArea, et j'espérais qu'il détecterait seul lorsque le contenu dépasse de son cadre.
    Cependant, aucune barre de défilement n'apparait et je ne peut pas accéder au contenu caché.
    J'ai essayé d'utiliser ui->scrollArea->setWidget() et setLayout(), ainsi que ui->scrollAreaWidgetContent mais sans succès.

    Voici mon ihm:
    Nom : ihm1.JPG
Affichages : 488
Taille : 24,1 Ko

    Et voici le code qui est lié au bouton "+":
    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
    nbrBaseInstallDir++;
     
        //On Descend le Frame Inf. de la partie Obligatoire
        int posYFrameInfOblig = ui->frameChpsObligInf->y();
        ui->frameChpsObligInf->move(10, posYFrameInfOblig+30);
     
        //On Descend le bouton +
        int posYBtnAdd = ui->pushButton->y();
        ui->pushButton->move(50, posYBtnAdd+30);
     
        //On crée un nouveau bouton "Rechercher..."
        int newPosYBtnAdd = ui->pushButton->y(); //On se base sur le bouton + pour placer notre nouveau bouton de recherche
        QPushButton *newPushButtonBaseInstallRep = new QPushButton("Rechercher...", this);
        newPushButtonBaseInstallRep->setGeometry(10, newPosYBtnAdd-30, 81, 21);
     
        //On crée un nouveau lineEdit pour le nouveau bouton de recherche
        int posYNewBtnSrch = newPushButtonBaseInstallRep->y(); //On se base sur notre nouveau bouton pour placer le nouveau lineEdit
        QLineEdit *newLineEditBaseInstallRep = new QLineEdit("", this);
        newLineEditBaseInstallRep->setGeometry(100, posYNewBtnSrch, 311, 21);
        ui->scrollArea->setWidget(ui->frameChpsObligInf);
    /*
        //Association des signaux/slots
        QObject::connect(newPushButtonBaseInstallRep, SIGNAL(clicked()), this, SLOT(grabDirPath()));
        newLineEditBaseInstallRep->setText(sndBaseInstallDir);
        */
    Au passage, je n'arrive pas à ajouter des boutons/lineEdit de façon dynamique (ils ne s'affiche pas et la connection signal/slot de ne se fait pas). Est-ce lié au fait que je souhaite les créer dans l'espace de mon QScrollArea ? Faut-il appeler une méthode du genre update() pour intégrer ces nouveaux bouton/lineEdit au QScrollArea ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je ne sais pas ce que tu cherches à faire avec ui->scrollArea->setWidget(ui->frameChpsObligInf);, mais tu devrais plutôt régler ce genre de chose dans le designer.

    Dans l'idée il suffit d'ajouter les nouveaux éléments au layout du widget enfant du QScrollArea. Un layout qui s'occupe automatiquement des positions des éléments, pas besoin de t'en occuper.
    Commence donc dans le designer par affecter un layout vertical au scrollAreaWidgetContent enfant du QScrollArea.

    Puis à chaque appui sur le bouton d'ajout, crée-toi un nouveau QWidget et insère tes nouveaux QPushButton et QLineEdit et autres éventuels éléments dedans. C'est ce widget que tu ajouteras au layout (que j'ai nommé ici scrollAreaLayout) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        QWidget *widget = new QWidget{ui->scrollAreaWidgetContent};
        QHBoxLayout *layout = new QHBoxLayout{widget};
     
        QPushButton *newPushButtonBaseInstallRep = new QPushButton("Rechercher...", widget);
        layout->addWidget(newPushButtonBaseInstallRep);
     
        QLineEdit *newLineEditBaseInstallRep = new QLineEdit("", widget);
        layout->addWidget(newLineEditBaseInstallRep);
     
        ui->scrollAreaLayout->addWidget(widget);
    Note que la syntaxe de connexion que tu utilises est obsolète, pense à te mettre à jour .

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Par défaut
    Merci pour ta réponse !
    Je ne sais pas ce que tu cherches à faire avec ui->scrollArea->setWidget(ui->frameChpsObligInf);,
    Bha à vrai dire, moi non plus J'ai essayé différentes choses vu à droite à gauche avant de finir par poster ce message.

    Commence donc dans le designer par affecter un layout vertical au scrollAreaWidgetContent enfant du QScrollArea.
    J'ai essayé, ça fonctionne. Plus qu'à me casser la tête pour trouver comment agencer tout ca pour avoir le résultat que je souhaite (pour le moment le frame inférieur vient se mettre dans le layout lorsque j'appuie sur le bouton "+" alors que j'ai bien séparé le frame du layout dans designer).

    Note que la syntaxe de connexion que tu utilises est obsolète, pense à te mettre à jour .
    Je vais regarder ça attentivement alors ! Encore merci pour ta réponse, je test ton code dans l'aprem mais je comprends déjà mieux comment incorporer mes widget à mon Layout.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Par défaut
    Mise à jour: J'arrive à ajouter dynamiquement mes lineEdit et mes boutons, puis lorsque je clique sur l'un d'eux, je peux choisir un répertoire comme prévue via un signal/slot, mais je n'arrive pas encore à récupérer le chemin dans le lineEdit associé... Pourtant j'ai un qDebug qui me renvoie bien le chemin récupéré et qui devrait être assigné au lineEdit via setText().

    Le code du slot "recupNewDir":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sndBaseInstallDir = grabDirPath();
        qDebug()<<"Signal reçu: Le nouveau bouton de recherche à été cliqué, le chemin vers le répertoire choisie est: "<<sndBaseInstallDir;
    Le code de "grabDirPath":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QFileDialog dialChoseDir;
        QString chosenDirPath = dialChoseDir.getExistingDirectory(this, tr("Répertoire d'installation des fichiers devant être copié"),"C:/Program Files",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
        sndBaseInstallDir = chosenDirPath;
        return chosenDirPath;

    J'ai essayé avec différents layout, et finalement celui qui colle le plus est le gridLayout. Cependant, je n'arrive plus (avec mon code ou le tiens et ce quelque soit le layout choisie) à obtenir la barre de défilement

    Le code que j'ai actuellement pour le bouton "+":
    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
    nbrBaseInstallDir++;
     
        //On Descend le bouton +
        ui->scrollAreaLayout->addWidget(ui->pushButton, 3+nbrBaseInstallDir, 0);
        ui->scrollAreaLayout->setAlignment(ui->pushButton, Qt::AlignCenter);
     
        //On crée un nouveau bouton "Rechercher..."
        QPushButton *newPushButtonBaseInstallRep = new QPushButton("Rechercher...", ui->scrollAreaWidgetContents_2);
        newPushButtonBaseInstallRep->setMaximumSize(81,21);
        newPushButtonBaseInstallRep->setMinimumSize(81, 21);
        ui->scrollAreaLayout->addWidget(newPushButtonBaseInstallRep, 3+nbrBaseInstallDir-1, 0);
     
        //On crée un nouveau lineEdit pour le nouveau bouton de recherche
        QLineEdit *newLineEditBaseInstallRep = new QLineEdit("", ui->scrollAreaWidgetContents_2);
        newLineEditBaseInstallRep->setMaximumSize(260, 21);
        newLineEditBaseInstallRep->setMinimumSize(260, 21);
        newLineEditBaseInstallRep->setEnabled(1);
        ui->scrollAreaLayout->addWidget(newLineEditBaseInstallRep, 3+nbrBaseInstallDir-1, 1);
     
        //Association des signaux/slots
        connect(newPushButtonBaseInstallRep, &QPushButton::clicked, this, &MainWindow::recupNewDir);
        newLineEditBaseInstallRep->setText(sndBaseInstallDir);
    Et mon interface:
    Nom : ihm2.JPG
Affichages : 449
Taille : 28,6 Ko

    J'ai essayé en mettant le contenu de mon frame inférieur (exe de l'appli, nom repertoire, etc...) dans le layout, puis comme sur l'image.
    De la même façon, j'ai essayé en mettant le tout dans le scrollArea, et en n'y mettant que mon layout avec les champs obligatoires.

    En bref, j'ai avancé sur la création dynamique de widget et son insertion dans les layout (quoique rien ne dit que mes problèmes ne viennent pas d'une mauvaise insertion de ce côté tant mon code diffère du tiens... J'essayerais de m'en rapprocher dans un premier temps), mais je n'ai toujours rien du côté du scrollArea.

    MISE A JOUR:
    J'ai finalement réussi à avoir les barres de défilement comme souhaitée. J'ai juste mis mon QGridLayout dans mon QScrollArea et ajouter au code ui->scrollAreaWidgetContents->setLayout(ui->scrollAreaLayout);

    Le code utilisé:
    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
    nbrBaseInstallDir++;
     
        //On Descend le bouton +
        ui->scrollAreaLayout->addWidget(ui->pushButton, 3+nbrBaseInstallDir, 0);
        ui->scrollAreaLayout->setAlignment(ui->pushButton, Qt::AlignCenter);
     
        //Mon Code
        //On crée un nouveau bouton "Rechercher..."
        QPushButton *newPushButtonBaseInstallRep = new QPushButton("Rechercher...");
        newPushButtonBaseInstallRep->setMaximumSize(81,21);
        newPushButtonBaseInstallRep->setMinimumSize(81, 21);
        ui->scrollAreaLayout->addWidget(newPushButtonBaseInstallRep, 2+nbrBaseInstallDir, 0);
     
        //On crée un nouveau lineEdit pour le nouveau bouton de recherche
        QLineEdit *newLineEditBaseInstallRep = new QLineEdit("");
        newLineEditBaseInstallRep->setMaximumSize(250, 21);
        newLineEditBaseInstallRep->setMinimumSize(250, 21);
        newLineEditBaseInstallRep->setEnabled(1);
        ui->scrollAreaLayout->addWidget(newLineEditBaseInstallRep, 2+nbrBaseInstallDir, 1);
        ui->scrollAreaWidgetContents->setLayout(ui->scrollAreaLayout);
     
        //Association des signaux/slots
        connect(newPushButtonBaseInstallRep, &QPushButton::clicked, this, &MainWindow::recupNewDir);
        newLineEditBaseInstallRep->setText(sndBaseInstallDir);
    Pour mon histoire de lineEdit qui ne se rempli pas, j'avais fait une erreur et modifiais deux fois une même variable. Donc je passe en résolu !
    Merci pour l'aide qui m'a bien aiguillé.

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

Discussions similaires

  1. Gestion des plans d'actions avec requête ajout
    Par 512banque dans le forum Modélisation
    Réponses: 3
    Dernier message: 08/01/2008, 08h58
  2. Pb gestion des éléments d'un tableau
    Par tonio_hawk dans le forum Linux
    Réponses: 3
    Dernier message: 20/01/2007, 23h34
  3. Manipulation des ensembles. Ajout d'éléments
    Par OutOfRange dans le forum Delphi
    Réponses: 11
    Dernier message: 11/11/2006, 19h27

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