1

J'essaie d'utiliser l'architecture de modèle/vue en C++ et QT et j'ai besoin de comprendre, comment est le meilleur moyen de diviser une cellule dans QTableView en plus lignes ou plusieurs colonnes et utiliser des widgets différents pour eux et aussi comment afficher juste quelques colonnes du modèle .Qt - modèle d'article/vue - plusieurs données dans une cellule de QTableView

Je veux maintenir cette structure par ligne:

- int 
- MyStruct - int 
      - QString 
- 2ndStruct - double 
      - double 
- QString 

Ce qui est important:

  1. Affichage dans le tableau 2D (par exemple QTableView) - sans arbres. Je peux changer de modèle, mais je dois l'afficher dans la table.
  2. Afficher seulement certaines des données du modèle.
  3. Selon l'index de la ligne - sélectionnez des colonnes du parent et aussi des données de l'enfant (structs).

J'ai quelques questions:

  1. Comment mettre en œuvre plusieurs lignes/colonnes dans une cellule QTableView et utiliser différents types et différents QWidgets pour eux?
  2. Comment sélectionner seulement certaines données que je veux afficher? Lorsque je réimplémente "columnCount" dans le modèle, je ne peux pas le mettre constant parce que je veux utiliser ce modèle dans une vue différente. J'ai lu des tutoriels et j'ai trouvé, qu'il n'y a pas besoin de réimplémenter la classe de vue. Comment puis-je sélectionner uniquement les données que je veux afficher?
  3. Est-il préférable d'utiliser un modèle 3D (QStandardItemModel avec QStandardItems) ou un modèle 2D (QAbstractTableModel) pour ce cas?

Répondre

1

Je suggère d'avoir des modèles distincts pour les différents besoins, mais laissez-les fonctionner sur les mêmes données.

I.e. les classes du modèle ne sont que des interfaces avec les données réelles, elles n'ont pas besoin de contenir les données. Supposons que vous ayez une structure/classe appelée RowData. Les données que vous avez décrites sont

Toutes les rangées pourraient alors être une liste ou un vecteur de tels objets, par ex. QVector<RowData>

Chaque modèle peut alors fonctionner sur la même référence ou pointeur vers un tel récipient

class AllDataInSeparateColumnsModel : public QAbstractTableModel 
{ 
public: 
    AllDataInSeparateColumnsModel(QVector<RowData> &data, QObject *parent = nullptr) 
     : QAbstractTableModel(parent), m_data(data) 
    {} 

    int rowCount() const { return m_data.count(); } 
    int columnCount() const { return 6; } 

private: 
    QVector<RowData> &m_data; 
}; 

Procédé data() pour ce modèle pourrait alors la carte colonne 0 de la première int, colonne 1 à l'int dans MyStruct , colonne 2 à la QString dans MyStruct et ainsi de suite.

Si un modèle nécessite plusieurs valeurs par colonne, il peut définir ses propres rôles supplémentaires. La vue a alors besoin d'un délégué correspondant qui peut récupérer ces données supplémentaires si nécessaire (le délégué standard n'affiche que la valeur de chaîne pour Qt::DisplayRole)