7
votes

Réglage du modèle sur un QTableWidget

Je veux écrire une application pouvant accéder à une table dans la base de données. J'ai pris Qsqltablodel comme composant modèle pour la table.

Le problème avec le QTableView est qu'il semble ne pas avoir de méthode qui renvoie l'enregistrement actuellement sélectionné dans le tableau, donc j'ai pris la classe QTableWidget qui interdit Qtableview.

Mais lorsque j'essaie de définir le modèle sur ce widget de table avec -> setmodel () i get

Le message d'erreur suivant:

c: / qt / qt / include / qtgui /../../ src / gui / itemviews / qtablewidget.h: 337: ERREUR: `Virtual vide QTableWidget :: Setmodel (QabstractTemModel *) 'est Privé.

Le message dit que la méthode "SetModel" est privée. Regarder dans le La documentation me dit que c'est public.

Que puis-je faire?


1 commentaires

J'ai besoin d'obtenir un disque dans une cellule, mais pas la coordination de celui-ci.


5 Réponses :


0
votes

Il est privé dans qTablewidget xxx

il est public dans qabstractitemView

de sorte que vous ne pouvez pas appeler cette fonction d'ici ...

chèque QTableWidget.h In Inclure \ QT \ QTableWidget.h

Ce n'est peut-être pas une bonne réponse, mais au moins cela montre pourquoi il ne fonctionne pas ...


0 commentaires

0
votes

QTableWidget: détails

La classe QTableWidget fournit une vue de table à base d'élément avec un modèle par défaut.

Les widgets de table fournissent des installations d'affichage de table standard pour les applications. Les articles d'un QTableWidget sont fournis par QTableWidgetem.

Si vous souhaitez une table qui utilise votre propre modèle de données, vous devez utiliser QTableView plutôt que cette classe.

La classe widget gère le modèle lui-même, si vous souhaitez utiliser votre propre modèle, utilisez la classe d'affichage.

Vous êtes correct qu'il ne semble pas y avoir de méthodes de connaissance de la sélection pour la View ou SQLModel. Vous pouvez obtenir votre propre classe à partir de la tableView et suivre la sélection en cours via le Slot Selectchanged .

ou

Utilisez le QTableView :: SelectionModel () et appelez Sélection () . Ceci est similaire à celui de MMutz's's Réponse . Assurez-vous de lire ce code pour les détails de Gory d'arriver à l'enregistrement.


1 commentaires

Prudent. Vous ne voulez pas sélectionModel ici: c'est le type utilisé pour gérer la sélection d'éléments dans la vue par, par exemple. en utilisant SHIFT-CLIQUE. Le modèle de données interne est simplement la propriété modèle d'une vue.



2
votes

La méthode est publique au niveau de qabstractitemView mais qtablawidget a un modèle intégré que vous ne pouvez pas changer.

Pour obtenir la sélection, vous devez appeler SEXEXITEMS () (qui est à nouveau une méthode de qabstractitemView et non qtableview qui est pourquoi vous Je l'ai manqué dans les docs).


4 commentaires

Je dois utiliser QTableView en raison de la fonction Public SetModel (), mais de la fonction QTableView Isnt SELECTELITEMS (). P.s. Désolé pour mon anglais.


Comme Aaron dit, SELECTELITEMS () est une partie de QTableView - c'est une partie de la classe de base QabstractTemView.


Je ne vois pas SELECTITEMS Sous QabstractItemView non plus: doc.trolltech.com/4.5/qabstractItemView-Members .html


Il y a une faute de frappe ci-dessus: elle devrait dire que QTableWidget possède un modèle intégré, pas Qtableview.



6
votes

Comme d'autres ont noté, ce n'est pas QTableWidget code> que vous voulez. C'est en effet qtalview code>. Obtenir les enregistrements est alors terminé comme suit:

void slotClicked( const QModelIndex & mi ) {
    // make sure we're really dealing with what we think we're dealing with:
    assert( static_cast<QSqlTableModel*>( tableView->model() )
            == qobject_cast<QSqlTableModel*>( tableView->model() );
    const QSqlRecord rec = static_cast<QSqlTableModel*>( tableView->model() )
               ->record( mi.row() );
    // use 'rec'
} 


2 commentaires

Si je comprends bien, je dois l'utiliser avec cliqué () signal. Mais je vérifie si la qliste est vide, je reçois que c'est vide. = /


Si vous utilisez qabstractitemview :: cliqué sur (qmodelindex) , le qmodelindex est transmis comme un argument de signal. Le code ci-dessus est destiné au cas où vous souhaitez voir ce que sont les enregistrements sélectionnés. Dans la case cliqué () , vous avez juste besoin des deux lignes à l'intérieur du q_foreach , avec MI étant le qmodelindex venant du signal.



0
votes

Je n'ai utilisé que l'architecture d'affichage du modèle une fois, mais je vais essayer de vous donner un aperçu général de cette architecture, car il me semble que vous ne le comprenez pas très bien. Donc, cela sera probablement incomplet et simplifié, mais espérons-le quelque peu correct.

Si vous travaillez avec une vue, vous pouvez fournir votre propre modèle. Si vous travaillez avec un widget, vous ne travaillez pas avec un modèle QT, mais insérez vous-même des objets vous-même. De préférence, vous travaillez avec un modèle pour découpler des choses (vous pouvez donc avoir plus d'une vue pour le même modèle, ou modifier le modèle plus tard, ...)

Lorsque vous utilisez un modèle, la vue sait elle-même comment demander le modèle que vous fournissez pour remplir la vue (à l'aide de la fonction de données). Il existe plusieurs façons d'obtenir une sélection à partir de cette vue: je l'ai gérée en connectant le signal cliqué, que l'affichage émet lorsque l'utilisateur clique sur la vue, sur une fonction de créne à sous je me suis écrit. Le signal cliqué fournit un index du tableau / liste que je mappe vers un élément de mon modèle dans cette fonction de créneau.

Il y a probablement plus de moyens de le faire, mais c'est comme ça que je l'ai fait et ça marche bien.

Pour obtenir une compréhension générale sur l'architecture du modèle QT:

http://doc.trolltech.com/4.5/model-view -Programmer.html


0 commentaires