9
votes

Actualiser automatiquement un QTableView lorsque les données ont changé

J'ai écrit un modèle de données personnalisé à afficher avec plusieurs QTableViews.

Techniquement, tout fonctionne bien: Mes vues montrent les modifications apportées à partir de mon modèle. Mon modèle de données est modifitable et la méthode setingdata () code> est émettant le signal datachanged () code> signal et renvoie true code> sur une édition réussie. P >

Cependant, mon problème est que je dois déplacer ma souris sur un qtableview code> pour montrer le changement réel, alors que j'aimerais que toutes les vues affichent les modifications lorsqu'elles ont été faites, sans Besoin d'interagir avec les vues pour qu'ils soient mis à jour. P>

aucune idée? Merci, p>


Il peut être pertinent de mentionner que je n'utilise pas le rôle qt :: éditrole code> pour éditer des données, mais plutôt une valeur d'énumération personnalisée (nommée activerole code>). P>

Voici ce que je cherche: mon modèle de données contient des propriétés sur la manière d'afficher les données, utilisées pour générer des feuilles de style qui sont dirigées vers les vues. P>

Ainsi, lors de la modification du modèle, pour chaque vue, tous ses éléments sont touchés, c'est pourquoi le signal datachanged () code> est envoyé avec des indices couvrant toutes les cellules. P>

J'ai aussi essayé d'émettre layoutChanged () code>, mais il ne semble pas modifier le comportement dans mon cas. P>

Voici un extrait du setdata () Code> Méthode: P>

QWidget* DataModelDelegate::createEditor(QWidget* parent, QStyleOptionViewItem const& option, QModelIndex const& idx) const
{
  auto editor = new DataModelEditor(parent);
  connect(editor, SIGNAL(activeItem()), this, SLOT(commitEditorData()));
  return editor;
}


3 commentaires

Pourriez-vous montrer le code de la fonction setingdata () ?


Votre SetData fonctionne donc sur la coutume Activerole au lieu de standard éditrole / displayrole , mais quel rôle vous définissez-vous sur les éléments? Supprimez-vous aussi data () ? Avez-vous un délégué de rendu personnalisé pour votre point de vue?


J'ai mis à jour ma question avec une implémentation de données, SetData, CreateeeDitor et telle. J'espère que cela t'aides!


3 Réponses :


-1
votes

Appelez-vous le setingdata () ? Est le signal datachanged () vraiment émis? Connectez-vous un emplacement de journalisation de débogage. J'ose spéculer que c'est un problème très similaire à la vôtre:

http: // www. qtcentre.org/threads/18388-refreshing-a-qtableviewView-Quand-QabstractTableModel-changes?s=fd88B7C4E59F4487A54E57F4487A5457DB551F3DF2C


3 commentaires

Les données sont correctement modifiées, DataChanged est émis si nécessaire, dans SetData ; Les changements apparaissent immédiatement sur la vue que j'interagie avec. Le seul problème est que la vue Autre Afficher les mêmes données doit avoir la souris dessus pour montrer les modifications. Je prospète avec votre lien!


A propos du lien, le problème est que le modèle de données est modifié mais non via des moyens QT, ce qui ne émet donc pas le signal datachanged ; Pas mon cas cependant: - /


Comment puis-je le faire de l'extérieur du modèle? C'est-à-dire sans le qmodelindex es? Je ne peux pas faire qmodelindex es des index entier car le constructeur est privé.



6
votes

J'ai trouvé le problème, lequel était que mon autre point de vue n'était pas correctement informé des modifications de données: Mes vues ont chacun montré différentes parties de mes données, de sorte que les autres vues devaient être informées du DataChaged () , mais pour leurs propres indices.

Sur une note latérale, j'ai également eu le problème de mettre à jour mes points de vue lorsque mon application QT n'était pas la fenêtre active de mon gestionnaire de fenêtres. La solution consistait à appeler repeindre () sur la fenêtre principale.


1 commentaires

La solution (appelant repeindre () ) n'a pas fonctionné pour moi. De plus, imo, la réponse n'est pas complète. Devrait décrire ou donner des exemples sur la manière d'utiliser dataCanged () dans le code pour atteindre l'effet attendu.



5
votes

J'ai rencontré le même problème et permettez-moi d'ajouter une explication détaillée aux réponses de PIWI. Si vous modifiez les données et que vous devez mettre à jour les colonnes simples ou plusieurs colonnes (ou lignes, en fonction de votre exigence), vous devez émettre un ensemble d'index pour basft à bowright.Pour exemple, si vous avez une table comme ci-dessous:

Entrez la description de l'image ici

et, vous avez maintenant modifié certaines données et souhaitez maintenant Mettez à jour la ligne de cellule 1, la colonne 1-2, puis vous devez émettre un signal DataChange < / a> xxx


1 commentaires

Comment puis-je le faire de l'extérieur du modèle? C'est-à-dire sans le qmodelindex es?