Bonjour à tous,

Voila le contexte de mon problème : J'ai une QListWidget qui contient des individus, et où à chaque changement d'individu dans la liste, sa fiche se charge dans un formulaire qui se trouve à coté. Ça, pas de problème ça marche.

Seulement quand on édite les données d'un individu, il faut les valider en appuyant sur un bouton "enregistrer".
Ce que j'ai choisis de faire c'est que lorsque l'utilisateur veut passer sur un autre individu alors qu'il n'a pas enregistré le précedent, un message lui demande si il veut ou non, passer à l'autre individu et perdre les modifications, ou alors rester sur l'individu courant.

Si l'utilisateur répond "non" il souhaite rester sur l'animal courant, et je cherche à ce que l’évènement "on_list_widget_currentRowChanged(int currentRow)" soit ignoré, et donc que l'index de ma QListWidget ne change pas.

J'ai donc choisis de réimplémenter la méthode event de QMainWindow.
J'ai fais comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
// ManchotsWindow2 hérite de QMainWindow
bool ManchotsWindow2::event ( QEvent * event )
{
    if ( this->ignore_next_event )
    {
        this->ignore_next_event = false;
        event->ignore();
    }
 
    if ( event->isAccepted() )
        return QMainWindow::event( event );
    else
        return false;
}

Et lors du déclanchement de mon evenement de changement d'individu je passe ma variable this->ignore_next_event à "true" :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void ManchotsWindow2::on_list_widget_currentRowChanged(int currentRow)
{
// Il faut ignorer ces 3 lignes, elles sont utilisés car j'ai une autre liste de "animaux recent" que je met à jour dynamiquement
    if ( is_changing_selected_individu )
        return;
    is_changing_selected_individu = true;
 
    // si il y a eu des changements et qu'on ne souhaite pas changer de manchot
    if ( !this->check_change() )
    {
        // du code ...
    }   
    else
        this->ignore_next_event = true;
 
    ui->list_widget->setFocus();
 
    is_changing_selected_individu = false;
}

Le problème : Tout va bien jusqu'à ce que je tombe dans le cas où l'utilisateur décide de ne pas accepter le changement d'individu et de rester sur l'individu courant. Ça fonctionne, mais après ça, mon interface ne répond plus du tout, plus aucun évènement ne fonctionne, malgré que la valeur de this->ignore_next_event soit repassée à "false".
Pour résumer, cela se bloque quand "bool event()" à renvoyé une fois "false".

Je ne comprend pas comment faire, merci d'avance pour votre aide.

oopinou