Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT] récupérer la ligne sélectionnée dans un QTreeView

Sujet résolu
25 octobre 2011 à 12:30:27

Bonjour à tous,

Je débute avec la Lib Qt et je ne comprend pas tout à fait comment marche un QtreeView.

1ere question : voici mon code minimal que j'ai en partie copié dans les samples de QTCreator, ça marche comme je veux mais là ou il y a des points d'interrogations, c'est les choses qui sont flous pour moi.
a quoi sert QSortFilterProxyModel ? le QStandardItemModel ?

2eme question : je souhaiterai récupérer la ligne qui est sélectionée par l'utilisateur, mais je ne vois pas du tout comment m'y prendre...

merci par avance de votre aide.




#include <QtGui/QApplication>
#include <QtGui/QtGui>
#include "QWidget"
#include "QHBoxLayout"
#include "QSortFilterProxyModel"
#include "QTreeView"
#include "QAbstractItemModel"

int main(int argc, char *argv[]) {
    
    QApplication app(argc, argv);
    
    QWidget *fen = new QWidget();       
    QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel();    // ??
    QTreeView *view = new QTreeView();  
    QStandardItemModel *itemModel = new QStandardItemModel(0,3,fen);      // ??
    QHBoxLayout *main_layout = new QHBoxLayout(); 
    proxyModel->setSourceModel(itemModel);        // ??
    
    
    itemModel->setHeaderData(0,Qt::Horizontal ,QObject::tr("Numero"));
    itemModel->setHeaderData(1,Qt::Horizontal ,QObject::tr("Utilisateur"));
    itemModel->setHeaderData(2,Qt::Horizontal ,QObject::tr("Montant"));
    
    itemModel->insertRow(0);
    itemModel->setData(itemModel->index(0,0),1);
    itemModel->setData(itemModel->index(0,1),"User1");
    itemModel->setData(itemModel->index(0,2),56);
    
    itemModel->insertRow(0);
    itemModel->setData(itemModel->index(0,0),2);
    itemModel->setData(itemModel->index(0,1),"User2");
    itemModel->setData(itemModel->index(0,2),45);
    
    fen->resize(400,300);
    
    view->setModel(proxyModel); // ??
    main_layout->addWidget(view);
    fen->setLayout(main_layout);
    
    fen->show();
    
    return app.exec();
}
  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2011 à 9:27:41

Salut !

1) Alors en fait tu n'étais pas obligé d'utiliser un système Model/Vue, mais puisque tu as fait comme ça : tout ce qui parle de modèle sert à personnaliser la façon dont sont stockées ou traitées les données dans le QTreeView. Il y a un modèle par défaut, mais tu peux en créer un toi même si tu veux.

2) Tu peux récupérer la liste des lignes sélectionnées en utilisant selectedItems() (doc)


  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2011 à 11:47:34

itemModel->currentIndex()->data().toString();


Normalement c'est quelque chose dans le genre. Si j'me suis trompé tu sais au moins où chercher ;) .
  • Partager sur Facebook
  • Partager sur Twitter
Pour ceux qui souhaiteraient apprendre à développer en Rust, un tuto en français est dispo ici. Pour voir mes projets : github.
26 octobre 2011 à 14:08:58

merci Misterjn pour ta réponse,

j'en ai profité pour enlever toutes les choses inutiles dans mon code, vu que je n'ai pas besoin de modèle particulier le modèle par défaut me convient tout à fait :p
du coup comme QTreeWidget hérite de QTreeView j'ai remplacé et pour récupérer la ligne sélectionnée ça donne ça :

void fenetre::supprimer_transaction()
{
    bool b;
    std::cout << "supprimer ! " << std::endl;
    std::cout << treeWidget->selectedItems().first()->text(0).toInt(&b) << std::endl;
    
}


avec treeWidget un QTreeWidget*.
je récupère une liste de QTreeWidgetItem*, je prend le premier auquel j'affiche la 1ère colonne qui dans mon cas correspond au numéro de transaction.

@imperio : on peut utiliser itemModel lorsque l'on as le modèle par défaut ??



une autre question :

je n'arrive pas à supprimer tout les QTreeWidgetItem de mon QTreeWidget.
la méthode clear() me fait planter le prog (je n'arrive pas avoir le code d'erreur).
je me suis orienté vers une suppression ligne par ligne seulement je n'y arrive pas non plus, car je ne trouve pas de moyen de connaitre le nombre de lignes qui se trouvent dans le QTreeWidget et par conséquent quand arrêter la boucle de suppression



  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2011 à 14:13:13

Citation : prepa75

@imperio : on peut utiliser itemModel lorsque l'on as le modèle par défaut ??



Si je ne dis pas de bêtise, il me semble que la classe QTreeView a un itemModem par défaut (à vérifier par contre, je n'ai pas de Qt sous la main donc je regarderai ça ce soir).
  • Partager sur Facebook
  • Partager sur Twitter
Pour ceux qui souhaiteraient apprendre à développer en Rust, un tuto en français est dispo ici. Pour voir mes projets : github.
26 octobre 2011 à 14:44:44

ok, merci beaucoup :D

par contre je n'arrive vraiment pas à supprimer un QTreeWidgetItem :colere2:

j'ai beau essayer avec la méthode clear(), avec la méthode takeTopLevelItem(), je ne vois pas comment faire...

je met un bout de code si quelqu'un as une idée :



QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0,s_num);
item->setText(1,user);
this->list.append(item);
treeWidget->addTopLevelItems(list);
std::cout << "top level : " << treeWidget->topLevelItemCount() << std::endl;
treeWidget->takeTopLevelItem(0);
std::cout << "top level : " << treeWidget->topLevelItemCount() << std::endl;


ça me retourne 1 et 1, je recupère l'index de item et c'est bien 0 donc je ne vois pas comment faire là

quelqu'un à une idée ??
  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2011 à 14:50:19

Je ne connaissais pas cette façon de faire, grâce à toi je viens de la découvrir, merci ! Cependant, navré mais ne connaissant pas cette méthode je ne peux pas t'aider. Par contre, je te conseille d'aller lire ce chapitre. Il te permettra peut-être de faire ce que tu veux, mais je doute que la méthode utilisée soit la même. Bonne chance !
  • Partager sur Facebook
  • Partager sur Twitter
Pour ceux qui souhaiteraient apprendre à développer en Rust, un tuto en français est dispo ici. Pour voir mes projets : github.
26 octobre 2011 à 18:06:51

Merci pour ton lien, c'est toujours bien d'avoir une piqure de rappel sur le design pattern MVC !
Content de t'avoir donné une autre façon de faire, en lisant la doc c'est celle qui me paraissait la plus simple. Sinon j'ai corrigé mon problème, ça venais pas du bout de code que j'ai donné mais plus un problème de ma part, oublier d'allouer ça a tendance à ne pas pardonner !

Sinon je tombe sur un autre problème assez génant : dans mon QTreeWIdget il y a des données qui sont des int et lorsque j'active le tri des éléments il me les classe comme si c'était des String, du coup l'ordre croissant ça donne ça : 1, 10, 2 etc...
tu connaitrai une méthode pour corriger ce problème cad dire au QTreeWidget que c'est des int pour telle colonne sans passer par un modèle personnalisé ??

merci d'avance
  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2011 à 23:49:43

Pour ça tu peux utiliser un filtre, le QSortFilterProxyModel. Pour ça par contre, j'ai regardé à fond dans la doc pendant un petit moment avant de réussir à m'en servir, donc je te souhaite bonne chance :lol: . Par contre ça marche super bien après ^^.
  • Partager sur Facebook
  • Partager sur Twitter
Pour ceux qui souhaiteraient apprendre à développer en Rust, un tuto en français est dispo ici. Pour voir mes projets : github.
27 octobre 2011 à 5:49:32

Oui, c'était un peu ma hantise, mais le sample qui est fourni avec QtCreator l'utilise, je vais essayer de le comprendre comme il faut et je posterai une utilisation minimale pour les autres :) bonne journée !
  • Partager sur Facebook
  • Partager sur Twitter
27 octobre 2011 à 14:51:18

Attention cependant, les version QXXXWidget (donc QTreeWidget), désactivent la possibilité de spécifier son propre modèle, la fonction setModel étant rendue privée.

De manière générale, les version QXXXWidget sont plutôt faites pour gérer du contenu statique. Dès lors que le contenu est dynamique (amené à changer), il vaut mieux passer par la version QXXXView.

Avec un QTreeView, tu pourras utiliser setModel et spécifier ton QSortFilterProxyModel.

A noter que l'implémentation de base de QSortFilterProxyModel gère déjà ce que tu veux (lessThan), en prenant soin d'effectuer la comparaison selon le type de données (QVariant::Type)
  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2019 à 17:34:08

Comment connaitre le nombre de ligne dans une QtreeView?

  • Partager sur Facebook
  • Partager sur Twitter
18 juin 2019 à 16:39:00

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter