2010-08-31 2 views
0

J'ai une application dans Qt qui écrase un arrêt au cas où un utilisateur n'a pas enregistré son document. Il ressemble à ceci:QtSingleApplication QMessageBox oui action est prise même si non est sélectionné

class MyApplication : public QtSingleApplication 
{ 
    public: 
    MyApplication(int argc, char *argv[]) : QtSingleApplication(argc, argv, true) 
    { 
    } 

    ~MyApplication() 
    { 
    } 

    void commitData(QSessionManager &manager) 
    { 
     if(manager.allowsInteraction()) 
     { 
      main->RequestShutdownOverride(); 
     } 
    } 

    void SetMainWindow(MainWindow *m) 
    { 
     main = m; 
    } 

    MainWindow *main; 
}; 

void MainWindow::RequestShutdownOverride() 
{ 
    if(myDocument->hasChanges() == true) 
    { 
     switch 
     (
      QMessageBox::warning 
      (
      NULL, 
      "Foobar", 
      "You are exiting without saving. Would you like to save?", 
      "Yes, save my document", "No, don't save my document", 
      0, 
      0, 
      1 
     ) 
     ) 
     { 
      case 0: 
       myDocument->save(); 
      break; 

      case 1: 
       app->exit(0); 
      break; 
     } 
    } 
} 

Le problème est pour un couple d'utilisateurs, ils vont fermer, la fermeture est surchargée cliquent sur « non » et il enregistre le document de toute façon. J'ai essayé de dépanner ce code et je ne trouve rien d'évident, et pire - si je crée mon propre profil sur leur machine, cela fonctionne à nouveau correctement.

Y at-il quelque chose que j'ai foiré dans le code, ou pourrait-il y avoir quelque chose d'autre qui le cause? J'ai essayé de changer les versions de Qt. La seule autre chose que ces deux utilisateurs semblent avoir en commun est qu'ils utilisent tous les deux Windows Vista, mais d'autres utilisent Vista et n'ont pas signalé ce problème. Des idées?

EDIT

J'utilise cette définition:

static int QMessageBox::warning 
(
    QWidget *parent, 
    const QString &title, 
    const QString &text, 
    const QString &button0Text, 
    const QString &button1Text = QString(), 
    const QString &button2Text = QString(), 
    int defaultButtonNumber = 0, 
    int escapeButtonNumber = -1 
) 
+0

Il s'est avéré être un logiciel malveillant. Nous avons créé un nouveau profil pour l'utilisateur et tout fonctionne à nouveau. Merci à tous pour votre aide, mais il semble que ce n'est pas un problème de programmation après tout. – jjacksonRIAB

+0

S'il vous plaît, * s'il vous plaît *, utilisez les énumérations fournies par la classe 'QMessageBox' au lieu de 0 et 1, cela vous évitera des tonnes de maux de tête dans le futur! – Ivo

Répondre

0

Un problème s'est avéré être un programme malveillant installé sur le profil de l'utilisateur.

0

Avoir un coup d'œil sur la documentation à TrollTech il me semble que 0 n'est pas retourné. Leur exemple utilise l'appel de fonction exec() que vous n'utilisez pas, mais je suppose que les valeurs de retour restent les mêmes de toute façon.

L'autre chose qui vient à l'esprit est ce qui se passe si vous fermez simplement la boîte de dialogue en utilisant le bouton de fermeture de la fenêtre?

+0

Cela semble toujours fonctionner correctement si j'appuie sur le bouton de fermeture ... Je n'ai pas vu les énumérations ici, je vais les essayer à la place puisque c'est plus clair quand même. Merci. – jjacksonRIAB

0

La valeur de retour de QMessageBox::warning() est enum QMessageBox::StandardButton, donc vous devrez chercher ceux qui verront comment la boîte de dialogue a été fermée.

+0

Je n'utilise pas les boutons standard. J'ai ajouté une définition pour la version surchargée de l'avertissement que j'appelle à mon poste. Je n'utilise pas button2Text pour 0, le bouton par défaut est le bouton 0, le bouton d'échappement est mappé sur le bouton 1, qui est annulé. – jjacksonRIAB

+0

OK. Je vois votre édition maintenant avec la définition. Que fait la mise en œuvre? –

+0

La mise en œuvre fonctionne, pour la plupart. C'est une application en production avec plus de 500 utilisateurs. Malheureusement, deux utilisateurs ont un problème: s'ils s'arrêtent, il leur demande d'enregistrer, ils sélectionnent non, et cela sauve quand même. Mais s'ils sortent juste et ne s'arrêtent pas, il fonctionne le même code et fonctionne bien. À ce stade, je soupçonne que ces deux logiciels ont des logiciels malveillants, des profils corrompus ou des applications tierces qui causent des problèmes parce que je me suis connecté sous mon propre profil sur leurs machines et cela fonctionne correctement ... – jjacksonRIAB

Questions connexes