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. P>
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. P>
Mais lorsque j'essaie de définir le modèle sur ce widget de table avec -> setmodel () i get p>
Le message d'erreur suivant: p>
c: / qt / qt / include / qtgui /../../ src / gui / itemviews / qtablewidget.h: 337: ERREUR: `Virtual vide QTableWidget :: Setmodel (QabstractTemModel *) 'est Privé. P> blockQuote>
Le message dit que la méthode "SetModel" est privée. Regarder dans le La documentation me dit que c'est public. P>
Que puis-je faire? P>
5 Réponses :
Il est privé dans qTablewidget il est public dans qabstractitemView p> de sorte que vous ne pouvez pas appeler cette fonction d'ici ... p> chèque QTableWidget.h In Inclure \ QT \ QTableWidget.h p> Ce n'est peut-être pas une bonne réponse, mais au moins cela montre pourquoi il ne fonctionne pas ... P> P>
La classe QTableWidget fournit une vue de table à base d'élément avec un modèle par défaut. P>
Les widgets de table fournissent des installations d'affichage de table standard pour les applications. Les articles d'un QTableWidget sont fournis par QTableWidgetem. P>
Si vous souhaitez une table qui utilise votre propre modèle de données, vous devez utiliser QTableView plutôt que cette classe. P> blockQuote>
La classe widget gère le modèle lui-même, si vous souhaitez utiliser votre propre modèle, utilisez la classe d'affichage. P>
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 a>. p>
ou p>
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. P>
Prudent. Vous ne voulez pas sélectionModel code> 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é code> modèle code> d'une vue.
La méthode est publique au niveau de Pour obtenir la sélection, vous devez appeler qabstractitemView code> mais qtablawidget code> a un modèle intégré que vous ne pouvez pas changer. p>
SEXEXITEMS () code> (qui est à nouveau une méthode de qabstractitemView code> et non qtableview code> qui est pourquoi vous Je l'ai manqué dans les docs). P>
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.
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'
}
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) code>, le qmodelindex code> 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é () CODE>, vous avez juste besoin des deux lignes à l'intérieur du q_foreach code>, avec MI code> étant le qmodelindex code> venant du signal.
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. P>
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, ...) P>
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. P>
Il y a probablement plus de moyens de le faire, mais c'est comme ça que je l'ai fait et ça marche bien. P>
Pour obtenir une compréhension générale sur l'architecture du modèle QT: p>
J'ai besoin d'obtenir un disque dans une cellule, mais pas la coordination de celui-ci.