void MainWindow::creeMenuExo(QString repertoire, QMenu * menuCourant) { //On crée un signalMapper qui établira le lien entre l'entrée de menu sélectionnée et le fichier à charger QSignalMapper *signalMapper = new QSignalMapper(this); connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(slotLanceExo(QString))); //On se positionne dans le répertoire des exercices QDir dir; dir.cd(repertoire); dir.setFilter(QDir::AllEntries | QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot); dir.setSorting(QDir::DirsLast); //On crée un filtre pour ne conserver que les fichiers .ini QStringList filters; filters << "*.ini"; dir.setNameFilters(filters); QFileInfoList list = dir.entryInfoList(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); if (fileInfo.isDir()) //Condition de sortie de la boucle de récursivité { //créer un sousmenu QMenu * menucree=new QMenu(fileInfo.fileName(),this); menu=menuCourant->addMenu(menucree); MainWindow::creeMenuExo(fileInfo.filePath(),menucree); //appel récursif } else { //créer un item de menu // Les lignes qui suivent sont adaptées à la façon de stocker les paramètres de calculette // On peut sinon utiliser : // QString nomItem = fileinfo.fileName(); // qui affichera le nom du fichier débarassé de son path QSettings parametres(fileInfo.filePath(),QSettings::IniFormat); //On récupère le nom de la calculette QString nomItem = parametres.value("nom").toString(); //qui est caché dans le .ini QAction *act=menuCourant->addAction(nomItem); //et on l'affecte à l'item de menu // Reste à définir les actions elles-mêmes et à les connecter !!! signalMapper->setMapping(act,fileInfo.filePath()); connect(act, SIGNAL(triggered()), signalMapper, SLOT(map())); } } }