J’ai essayé d’utiliser les pointeurs sur fonction, mais je suis bloqué est pourtant l’erreur n’est pas apparente.
Remarque : j’ai supprimé le code inutile pour augmenter la lisibilité.
Donc voici mon code.
J’ai une fonction
void ClasseFunctCom::majTableView(void (*pf)(QStandardItemModel* model, std::string table_name), QTableView *tableView, string name_table)
{
//Si la base de données a était ouverte on continue, et on affecte la table des produits brutes au model
connexion();
//On déclare le model
//QSqlTableModel *modelTable = new QSqlTableModel(0, _db);
QStandardItemModel* model = new QStandardItemModel();
//On recupere les éléments et on remplit le model avec le pointeur sur fonction;
(*pf)(model, name_table); //LIGNE A
//On affecte le model à la table view
tableView->setModel(model);
//Autres code
}
Dans la quelle j’utilise le pointeur sur fonction
Ensuite j’ai la fonction suivante que je pointe
//LIGNE B
void ClasseBaseDeDonnees::recupererTout(QStandardItemModel* model, std::string table_name)
{
//code a réalisé
}
Ensuite j’ai une fonction dans la quelle j’appelle une fonction par son pointeur //LIGNE B
void MainWindow::supprimerElements()
{
//Autres code
//On fait une mise a jour de la tableview
majTableView(recupererTout, tableViewActuelle, name_table); //LIGNE B
//majTableView(tableViewActuelle, name_table);
//On aafiche un message de satisfaction a l'utilisateur.
QMessageBox::information(this, QObject::tr("Succès"), QString::number(nbrElmtsSupprimer)+" "+QObject::tr("élément(s) supprimé(s)"));
}
Mais quand je lance le programme, jai l’erreur suivante
D:\Fichiers applications\C++\Projets_QtCreator\Projet_memo_movies\Memo_movies\MainWindow.cpp:56: erreur : no matching function for call to 'MainWindow::majTableView(<unresolved overloaded function type>, QTableView*&, std::__cxx11::string&)'
Merci ads00, mais en fait, j'ai deux fonctions, qui me servent à remplir un QTableView, elles reçoivent 2 paramètres (QStandardItemModel*model,std::string table_name) l'une des deux fonction remplira le modele avec toute la table, alors que la deuxième ne le remplira qu'avec les élément qui correspondent à une recherche. c'est pour ça que j'ai opté pour les pointeurs sur fonction.
non en fait, std::fonction n'est pas adapter à mon cas, vue que mes deux fonctions ne change pas de type de paramètres
void ClasseBaseDeDonnees::recupererTout(FillTableView& fillTableView)
et voici
void ClasseBaseDeDonnees::rechercherElmts(FillTableView& fillTableView)
et voici la structure
//////////////////////////////////////////////////////////////////////////////////////////////////
/// \struct FillTableView
/// \brief Structure qui contient les données pour remplir le modele de la tableView.
struct FillTableView
{
QStandardItemModel* item_model;
QTableView* table_view;
std::string table_name;
std::string titre_name;
};
quelqu'un m'a donné la solution sur un autre forum
l'erreur venait du fait que les fonctions étaient des fonctions membres, alors iil faut les déclarées de cette façon
void ClasseFunctCom::majTableView(void(ClasseBaseDeDonnees::*pf)(QStandardItemModel* model, std::stringtable_name),QTableView*tableView,stringname_table){//.....//On recupere les éléments et on remplit le model avec le pointeur membre sur fonction membre;(this->*pf)(model, name_table);// on a accède//....}
je suis en train de tester la solution et je vous tiendrai au courant
Désolé pour le retard, mais j'avais un problème de formatage.
En tout cas j'ai changé de stratégie, parce que finalement le jeu ne vaut pas la chandelle, je n'avais pas vraiment la nécessité d'utiliser les pointeurs sur fonction.
en tout cas si ça peut aider quelqu'un :
si il s'agit d'une fonction membre il faut procéder de cette façon :
void ClasseFunctCom::majTableView(void (ClasseBaseDeDonnees::*pf)(QStandardItemModel* model, std::string table_name), QTableView *tableView, string name_table)
//.....
//On recupere les éléments et on remplit le model avec le pointeur membre sur fonction membre;
(this->*pf)(model, name_table); // on a accède
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Eug