Aide pour obtenir les données insérées après le signal rowInserted de Qt
-
05-07-2019 - |
Question
J'ai une méthode onText qui se connecte à un SIGNAL rowsInserted de QAbstractItemModel pour pouvoir être averti lorsque de nouvelles lignes ont été insérées:
QObject::connect(model, SIGNAL(rowsInserted ( const QModelIndex & , int , int ) ),
client_,SLOT(onText( const QModelIndex & , int , int )) )
Le signal fonctionne correctement car je suis averti lorsque des lignes sont insérées. Voici la méthode onText:
void FTClientWidget::onText( const QModelIndex & parent, int start, int end )
{
Proxy::write("notified!");
if(!parent.isValid())
Proxy::write("NOT VALID!");
else
Proxy::write("VALID");
QAbstractItemModel* m = parent.model();
}
Mais je n'arrive pas à obtenir la chaîne des éléments insérés. Le QModelIndex " parent " passé n'est PAS VALIDE, et "m". QAbstractItemModel est NULL. Je pense que c'est parce que ce n'est pas un élément réel, mais juste un pointeur sur un? Comment puis-je obtenir le texte / les éléments insérés?
La solution
Le parent n'étant pas valide pour les éléments de niveau supérieur, une autre option consisterait à donner à FTClientWidget accès au modèle (s'il ne viole pas la conception souhaitée). FTClientWidget peut alors utiliser les arguments de début et de fin directement sur le modèle. modèle lui-même:
void FTClientWidget::onText( const QModelIndex & parent, int start, int end )
{
//Set our intended row/column indexes
int row = start;
int column = 0;
//Ensure the row/column indexes are valid for a top-level item
if (model_->hasIndex(row,column))
{
//Create an index to the top-level item using our
//previously set model_ pointer
QModelIndex index = model_->index(row,column);
//Retrieve the data for the top-level item
QVariant data = model_->data(index);
}
}
Autres conseils
Le parent sera toujours non valide pour les éléments de niveau supérieur, vous pouvez donc vous attendre à ce qu'il ne soit pas valide. La documentation de Qt contient une bonne explication de exactement comment fonctionne le parent. début
est la première ligne à laquelle un enfant a été inséré, et fin
est la dernière ligne à laquelle un enfant a été inséré.
Ainsi, vous pouvez y accéder avec quelque chose comme ce qui suit:
int column = 0;
// access the first child
QModelIndex firstChild = parent.child(first, column);
QModelIndex lastChild = parent.child(end, column);
// get the data out of the first child
QVariant data = firstChild.data(Qt::DisplayRole);
Ou, si vous le souhaitez, vous pouvez utiliser l'index pour récupérer le modèle à partir duquel vous pouvez y accéder.