ajouter dynamiquement des données de QTableView
Je suis en train d'écrire un simple TableView
selon
http://harmattan-dev.nokia.com/docs/library/html/qt4/itemviews-addressbook.html
class MyModel : public QAbstractTableModel {
Q_OBJECT
public:
QList<QPair<string, int> > data_;
....
Comment ajouter des lignes au modèle de façon dynamique? data_.insert(..)
ne va pas changer la vue, actuellement je écrire une fonction pour ajouter une nouvelle ligne:
void my_append_data(const string& first, int second) {
int row = rowCount(QModelIndex());
insertRow(row); //insert a empty row
//fill the row
setData(createIndex(row, 0), QVariant::fromValue<string>(first), Qt::EditRole);
setData(createIndex(row, 1), QVariant::fromValue<int>(second), Qt::EditRole);
}
//usage
model.my_append_data("11111", 111);
model.my_append_data("22222", 222);
Cela semble inefficace cause de la setData
est appelé à deux reprises lors de l'ajout d'une ligne, car il s'agit de deux colonnes, et il peut y avoir plusieurs colonnes dans l'avenir.
Une meilleure façon d'ajouter des lignes?
Grâce.
OriginalL'auteur aj3423 | 2013-11-15
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de savoir pourquoi vous pensez qu'il est inefficace. Cependant vous pouvez le faire plus simple.
Je serais probablement écrire votre fonction comme celle-ci, qui permettrait de faire plus d'avenir contre les changements à la colonne compte et types:
Utilisation:
De base (et la plupart des Qt types) peuvent être implicitement converti en
QVariant
s, il n'ya donc pas besoin d'appelerQVariant::fromValue()
Aussi si vous êtes en utilisant Qt, vous avez normalement à l'aide de
QString
s, passtd::string
s.Je ne vois pas pourquoi ce code est mieux que le code en question, je dirais que c'est encore pire. OMI, ma réponse est beaucoup mieux.
OriginalL'auteur Chris
Votre code est étrange! Lorsque vous sous-classement
QAbstractTableModel
et de faire quelques opérations sur les données (sur votredata_
) que vous venez d'émettre des signaux appropriés (ou appeler certains protégé méthodes pour faire ce genre de signal émet) pour informer les vues que quelque chose a été changé dans le modèle!Donc dans votre cas, il doit être quelque chose comme comme:
Si d'autres parties de votre modèle sont écrites correctement, il devrait fonctionner parfaitement.
Le code écrit dans d'autres, c'est exactement l'aide de l'API conçu pour être utilisé par des vues de fonctionner sur le modèle. Cela crée une surcharge inutile.
data_.append(QPair<string, int>(first, second));
Je ne peux pas le faire, à cause de la modification se fait dans une autre classeLe modèle est un objet proxy à des données réelles. Donc, si les données sont modifiées par certaines externe code, ce code doit fournir certains mécanisme de notification que vous devez utiliser pour envoyer des mises à jour pour le modèle de données. Cela dépend des détails de votre problème.
OriginalL'auteur Marek R