Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.8.0 - Qt Creator : 4.3.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Différentes questions sur un Qtreeview

19 May modifié dans Qt / Langage C++
Bonjour, j'ai quelques problèmes avec mon Qtreeview (je ne m'en sortirais jamais avec ça :(( )
J'ai mon arbre comme ceci : http://imgur.com/a/7NQsY
Si vous avez besoin du code complet dites le moi.

1) J'ai crée deux setHorizontalHeaderItem() liés au model mais comme vous pouvez le voir le premier étant "rogné" alors qu'il y a la place pour afficher les deux complets.

2) Comment déplier uniquement le dossier "en cours" par défaut ? Car il y a un ExpandAll() qui permet de tout dérouler d'un coup mais ce n'est pas très modulable.

3) Pour chaque lignes (ex : DT-6 | moi) je détecte le clique pour récupérer le numéro du DT mais lorsque je clique sur le "moi" la valeur retourné n'est pas celle attendu puisequ'il s'agit d'un autre index dans l'arbre.
Je crée cette ligne comme ceci :
dossier_cours->appendRow(QList<QStandardItem*>() << item << item_demandeur);
Ma question est donc comment faire en sorte que, lorsqu'on clique sur toute la ligne le seul index retourné est celui du premier item de la ligne ? Peut être utiliser la QList ?

Après ces trois détails fixés j'en aurai fini avec ce Qtreeview ! Merci pour votre aide.

Réponses

  • Bonjour, pour point 1 as tu essayé
    treeView.header()->->setSectionResizeMode(QHeaderView::ResizeToContents);
  • Bonjour, merci ça fonctionne bien. Plus que 2... Oups j'avais oublié un point.

    4) http://imgur.com/a/u8kBS Sur la deuxième colonne en face des deux dossiers il y a des champs que l'on peut éditer comment supprimer ceci ?
  • Pour le point 3, j'ai fait un essai qui semble fonctionner pour savoir sur quoi on clique.

    On peur recuperer l'indes courrant avec QTreeView::currentIndex()

    //creation et remplissage du model

    void MainWindow::initModel()
    {
    QStringList lst;
    lst << "A" << "B" << "C" << "D";

    _model.clear();
    _model.setColumnCount(2);
    _model.setRowCount(lst.size());

    for(int x = 0; x < lst.size(); x++){
    QStandardItem *item = new QStandardItem;
    item->setData(lst.at(x), Qt::EditRole);

    item->setColumnCount(2);
    item->setRowCount(5);

    for(int y = 0; y < 5; y++){
    QStandardItem *sousItem1 = new QStandardItem;
    sousItem1->setData(lst.at(x) + " " + QString::number(y), Qt::EditRole);
    sousItem1->setData(QBrush(Qt::blue), Qt::BackgroundRole);
    item->setChild(y, 0, sousItem1);

    QStandardItem *sousItem2 = new QStandardItem;
    sousItem2->setData(lst.at(x) + " " + QString::number(y) + " bis", Qt::EditRole);
    sousItem2->setData(QBrush(Qt::red), Qt::BackgroundRole);
    item->setChild(y, 1, sousItem2);
    }

    _model.setItem(x, 0, item);
    }

    connect(ui->treeView, &QTreeView::doubleClicked, this, &MainWindow::voirIndex, Qt::UniqueConnection);

    ui->treeView->setModel(&_model);
    }

    //affichage des coordonnées

    void MainWindow::voirIndex(const QModelIndex &index)
    {
    QModelIndex parent = index.parent();
    if(parent.isValid()){
    qDebug() << "Parent: " << parent.row() << ", " << parent.column() << " --- " << _model.data(parent);
    }
    else{
    qDebug() << "Parent: invalide";
    }
    qDebug() << "Enfant: " << index.row() << ", " << index.column() << " --- " << _model.data(index);


    QModelIndex index2 = ui->treeView->currentIndex();
    QModelIndex parent2 = index2.parent();
    if(parent.isValid()){
    qDebug() << "Parent2: " << parent2.row() << ", " << parent2.column() << " --- " << _model.data(parent2);
    }
    else{
    qDebug() << "Parent2: invalide";
    }
    qDebug() << "Enfant2: " << index2.row() << ", " << index2.column() << " --- " << _model.data(index2);
    }

  • 19 May modifié
    Voici la même fonction de construction du model qui resoud le point 4:
    Crée des items vide pour boucher les trous et utilise QStandardItem::setEditable(false)

    void MainWindow::initModel()
    {
    QStringList lst;
    lst << "A" << "B" << "C" << "D";

    _model.clear();
    _model.setColumnCount(2);
    _model.setRowCount(lst.size());

    for(int x = 0; x < lst.size(); x++){
    QStandardItem *item1 = new QStandardItem;
    item1->setData(lst.at(x), Qt::EditRole);

    item1->setColumnCount(2);
    item1->setRowCount(5);

    for(int y = 0; y < 5; y++){
    QStandardItem *sousItem1 = new QStandardItem;
    sousItem1->setData(lst.at(x) + " " + QString::number(y), Qt::EditRole);
    sousItem1->setData(QBrush(Qt::blue), Qt::BackgroundRole);
    item1->setChild(y, 0, sousItem1);

    QStandardItem *sousItem2 = new QStandardItem;
    sousItem2->setData(lst.at(x) + " " + QString::number(y) + " bis", Qt::EditRole);
    sousItem2->setData(QBrush(Qt::red), Qt::BackgroundRole);
    item1->setChild(y, 1, sousItem2);
    }

    item1->setEditable(false); // modif ici

    _model.setItem(x, 0, item1);

    QStandardItem *item2 = new QStandardItem; // modif ici
    item2->setData("", Qt::EditRole); // modif ici
    item2->setEditable(false); // modif ici

    _model.setItem(x, 1, item2); // modif ici
    }

    connect(ui->treeView, &QTreeView::doubleClicked, this, &MainWindow::voirIndex, Qt::UniqueConnection);

    ui->treeView->setModel(&_model);
    }
  • Pour le point 2 tu as
    void QTreeView::expand(const QModelIndex &index)
    Si tu regarde la doc de void QTreeView::expandAll(), on trouve la ligne très utile
    See also collapseAll(), expand(), collapse(), and setExpanded().
  • 22 May modifié
    Bonjour, je regarde tout ça, merci de ton aide.

    Je n'arrive pas a accéder a l'index de ce que je veux expand() lors de la création, je sais uniquement retourner l'index lorsque j'utilise un connect(const QModelIndex &) sur un clique dans l'arbre mais a la création comment retourner l'index qui m’intéresse ?

    EDIT :
    Pour le point 4) ça fonctionne bien mais est-il possible de dérouler l'arbre même si on clique sur ces items vident ?
  • a la création comment retourner l'index qui m’intéresse ?
    Par exemple:

    void MainWindow::initModel()
    {
    QStringList lst;
    lst << "A" << "B" << "C" << "D";

    _model.clear();
    _model.setColumnCount(2);
    _model.setRowCount(lst.size());

    QList<QModelIndex> listeAAficher;// modif ici

    for(int x = 0; x < lst.size(); x++){
    QStandardItem *item1 = new QStandardItem;
    item1->setData(lst.at(x), Qt::EditRole);

    item1->setColumnCount(2);
    item1->setRowCount(5);

    for(int y = 0; y < 5; y++){
    QStandardItem *sousItem1 = new QStandardItem;
    sousItem1->setData(lst.at(x) + " " + QString::number(y), Qt::EditRole);
    sousItem1->setData(QBrush(Qt::blue), Qt::BackgroundRole);
    item1->setChild(y, 0, sousItem1);

    QStandardItem *sousItem2 = new QStandardItem;
    sousItem2->setData(lst.at(x) + " " + QString::number(y) + " bis", Qt::EditRole);
    sousItem2->setData(QBrush(Qt::red), Qt::BackgroundRole);
    item1->setChild(y, 1, sousItem2);
    }

    item1->setEditable(false);

    _model.setItem(x, 0, item1);

    QStandardItem *item2 = new QStandardItem;
    item2->setData("", Qt::EditRole);
    item2->setEditable(false);

    _model.setItem(x, 1, item2);

    if(/*les conditions pour afficher le item*/){ // modif ici
    listeAAficher << _model.index(x, 0);
    }
    }

    connect(ui->treeView, &QTreeView::doubleClicked, this, &MainWindow::voirIndex, Qt::UniqueConnection);

    ui->treeView->setModel(&_model);

    for(int i = 0; i < listeAAficher.size(); i++){ // modif ici
    ui->treeView->setExpended(listeAAficher.at(i), true)
    }
    }
  • Bonjour, c'est bon ça fonctionne, il faut bien faire en sorte de mettre le setExpanded() après :
    tree->setModel(model);
    Sujet clôt, tout à été plus ou moins corrigé / bidouillé.
Connectez-vous ou Inscrivez-vous pour répondre.