2010-12-08 7 views
-1

Je lisais le tutoriel MVC et je voulais essayer le code, mais pour une raison quelconque (que je n'arrive pas à comprendre) ça ne marche pas.Quel est le problème avec ce code Qt?

Ce code est censé afficher le contenu du répertoire courant dans QListWidget.

#include <QApplication> 
#include <QFileSystemModel> 
#include <QModelIndex> 
#include <QListWidget> 
#include <QListView> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QFileSystemModel *model = new QFileSystemModel; 
    QString dir = QDir::currentPath(); 
    model->setRootPath(dir); 
    QModelIndex parentIndex = model->index(dir); 
    int numRows = model->rowCount(parentIndex); 
    QListWidget *list = new QListWidget; 
    QListWidgetItem *newItem = new QListWidgetItem; 

    for(int row = 0; row < numRows; ++row) { 
     QModelIndex index = model->index(row, 0, parentIndex); 
     QString text = model->data(index, Qt::DisplayRole).toString(); 
     newItem->setText(text); 
     list->insertItem(row, newItem); 
    } 

    list->show(); 
    return a.exec(); 
} 
+8

"ça ne marche pas" n'est pas très descriptif du problème. Si vous voulez de l'aide, s'il vous plaît faites savoir aux gens ce que vous avez besoin d'aide. Est-ce qu'il compile? Qu'est ce que ça fait? Comment savez-vous "ça ne marche pas"? Qu'avez-vous essayé? Aide * nous * vous aide * vous *. – KevenK

+0

Je pourrais probablement vous dire quel est le problème, mais vous pourriez être offensé. –

+0

Si vous n'avez rien d'utile à ajouter, n'augmentez pas la longueur de la page. Et je suis d'accord, j'aurais dû être plus descriptif. – nik

Répondre

4

Il y a 2 problèmes.

Le premier described by Frank Osterfeld's answer. Déplacer:

QListWidgetItem *newItem = new QListWidgetItem; 

dans votre boucle.

La seconde concerne le modèle de threading de QFileSystemModel. de la documentation pour QFileSystemModel:

Contrairement au QDirModel, QFileSystemModel utilise un thread séparé pour se remplir afin de ne pas provoquer le thread principal pour accrocher le système de fichiers est en cours d'interrogation. Les appels à rowCount() renverront 0 jusqu'à ce que le modèle remplisse un répertoire.

et

Note: QFileSystemModel nécessite une instance d'une application graphique.

Je ne pense pas QFileSystemModel() fonctionnera correctement jusqu'à ce que après la boucle d'événements Qt est en cours d'exécution (qui est lancé par a.exec() dans votre exemple).

Dans votre cas, model->rowCount(parentIndex) renvoie 0, même s'il y a des éléments dans le répertoire (du moins, c'est ce qu'il fait sur mon test).

Remplacement QFileSystemModel avec QDirModel (et la suppression de l'appel, qui QDirModel` ne supporte pas model->setRootPath(dir)) Remplit la liste.

+0

parfait, maintenant quand j'utilise QListView et QFileSystemModel dans le code ci-dessus, tout fonctionne bien. Est-ce parce que QListView va se mettre à jour une fois que le modèle aura été mis à jour? – nik

+0

Je suis moi-même novice en ce moment (et je ne suis pas vraiment un programmeur graphique en général). Je ne peux pas aider beaucoup avec des détails sur l'architecture de modèle/vue de Qt, mais votre conclusion au sujet de QListView/QFileSystemModel semble raisonnable. –

1

Vous devez créer un nouvel élément pour chaque ligne. Déplacer

QListWidgetItem *newItem = new QListWidgetItem; 

dans la boucle for.