8
votes

Les données QabstractTemModel () ne sont jamais appelées

J'essaie de créer un Qtreeeeview et d'utiliser un modèle personnalisé pour cela. J'ai placé des énoncés qdebug () code> à divers endroits et j'ai déterminé que données () code> est jamais fort> être appelé. Comment puis-je résoudre ce problème?

Le code du modèle est inférieur à p>

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    NeuralNetwork* network = new NeuralNetwork();
    modelNeural = new ModelItemNeural();
    modelNeural->setRootNode(network);
    ui->treeView->setModel(modelNeural);

    update();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionNew_triggered()
{
    NeuralNetwork* network = new NeuralNetwork();

    modelNeural->setRootNode(network);
    ui->treeView->update();
}


5 commentaires

Votre méthode de données () est-elle virtuelle?


@Sebastian n, il est remplacé par QabstractTemmodel.


Aucune méthode de données () n'est remplie de QabstractTemmodel. La signature est correcte (QTCreator Show's IT Italicized signifie qu'il s'agit d'une fonction de remplacement).


Bien, en supposant qu'il n'y a pas de magie, je pense que vous avez échoué dans certaines fonctions. Vérifiez que vous revenez jamais index valide, Nombre de lignes> 0. Aussi, qu'est-ce que cela signifie: si (parent.column ()> 0) {retour 0; } ? En outre, vous n'avez pas besoin d'écrire boolvar == true . C'est assez boolvar


Pensez à utiliser MODLETTEST - Très probablement, il révélera beaucoup de bugs cachés. développeur.qt.nokia.com/wiki/model_test


3 Réponses :


0
votes

Avez-vous ajouté le modèle (pas l'article) au contrôle TreeView? Avez-vous créé des articles de votre type dérivé et les ajoutez au modèle? Les données () doivent être appelées si votre modèle est accessible.


4 commentaires

Oui, j'ai les deux définir le modèle sur TreeView et créé un élément pour ce modèle. Étant donné que le modèle envoyé à l'arborescence est un pointeur, il ne devrait pas d'importer la commande que je fais cela (Ajouter à TreeView VS Ajoutez l'élément au modèle).


Si vous n'avez pas connecté le modèle à la vue sur l'arborescence avant d'ajouter l'élément au modèle, les signaux indiquent que la vue de la mise à jour ne serait pas vue. C'est peut-être un problème de rafraîchissement? Je remarque également que vous créez vos propres index. L'index n'est peut-être pas valide, donc il ne tente jamais d'aller chercher des données à l'aide de cet index? Si vous n'avez pas besoin de indices spéciaux, j'utiliserais la méthode à partir d'une classe de base. Moins à aller mal;)


Je pensais index () était pur virtuel


Ah désolé. J'ai utilisé une classe non abstraite et héritée de celle-ci. Ils fournissent la plupart des méthodes et je n'avais pas besoin de les changer.



5
votes

Le problème est ce fragment:

int ModelItemNeural::rowCount(const QModelIndex& parent) const
{
    if (parent.isValid() == false)
    {
        return 0;
    }


4 commentaires

J'ai fait ce changement et que les données () ne sont toujours pas appelées. Cependant, maintenant RowCount () retourne 0 (ce qui est correct). Les seules autres fonctions étant appelées sont HeaderData () et index (). L'index () renvoie maintenant toujours un QModelindex () vide car la racine n'a pas d'enfants. Pouvez-vous avoir un arbre de 1 article? Je vais ajouter davantage au fur et à mesure que le programme fonctionne.


@jecjackal Si votre arbre est effectivement vide, pourquoi vous attendez-vous à ce que des données () soient appelées? Ajoutez d'abord quelques lignes (haut niveau). Un ou un mille, peu importe.


J'ai un article là-bas (l'élément racine). Dois-je appeler "INSERTROWS ()" manuellement? Je vais donner cela un coup.


Je viens de trouver un exemple qui est venu avec le QT SDK 2.2.1. Son appelé "édittablereemodel". Ce n'est pas situé sur la page d'accueil où beaucoup d'exemples sont stockés. Ce modèle fait exactement ce que j'essaie de faire. Merci pour l'aide tous



0
votes

Vous devez remplacer la méthode suivante dans votre classe héritée QabstractTemModemModemModel:

Index QModelindex (Int ligne, colonne INT, const qmodelindex & parent = qmodelindex ()) const;

Puis écrivez ceci dans:

retour Créerindex (rangée, colonne, nullptr);

quelque chose comme ceci:

index qmodelindex (int ligne, colonne INT, const qmodelindex & parent) const { Retour Createindex (rangée, colonne, nullptr); }


0 commentaires