12
votes

Fermer un QMainWindow au démarrage?

J'ai une application Qt qui utilise un qmainwindow code> classe autorisée pour l'interface utilisateur principale. Au démarrage, je souhaite faire des contrôles de sécurité et, s'ils échouent, affichez un message à l'utilisateur et fermez la fenêtre principale. Actuellement, je fais ces chèques dans le constructeur qmainwindow code>, mais si j'appelle la méthode ferme code>, rien ne se passe et l'application continue de fonctionner. Par exemple:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    setupUi(this);
    ...
    if (checkFails())
    {
        QMessageBox::warning(this, tr("Error"), tr("You cannot run this app"));
        // This has no effect
        close();
    }
}


0 commentaires

4 Réponses :


2
votes

tr est un Membre statique public de qobject. Vous devriez pouvoir appeler qObject :: tr ("erreur") dans votre fonction principale.


0 commentaires

0
votes

Avez-vous essayé d'abord cacher () ing de la fenêtre (cela devrait survenir quand même lorsque Fermer () est appelé) pour voir si cela permet ensuite de fermer () de détruire la fenêtre.

Si cela ne fonctionne pas, vous pouvez toujours essayer de détruire (vrai, vrai) la fenêtre avec des sous-fenêtres.


0 commentaires

29
votes

La boucle d'événement doit être utilisée avant de pouvoir fermer avec succès la fenêtre principale. Puisque vous construisez probablement d'abord une fenêtre, puis commencez la boucle d'événement, le fermeture () code> L'appel n'a aucun effet. Essayez la solution suivante à la place:

QTimer::singleShot(0, this, SLOT(close()));


2 commentaires

QMetaObject :: Invokemethod (Ceci, "Fermer", Qt :: QueueConnection); accomplit la même chose, mais je considère l'intention légèrement plus claire.


@ Marcus10110, belle suggestion, je suis d'accord c'est mieux.



3
votes

La plupart des applications démarrent en trois étapes: 1) Construisez la fenêtre; 2) montrer la fenêtre; 3) Démarrer la boucle d'événement. Vous pouvez faire des étapes 2 et 3 conditionnelles sur le succès de l'étape 1 en ajoutant un drapeau, dont la valeur est définie par le constructeur de la fenêtre, à la classe de la fenêtre:

Classe de fenêtre: P>

int main()
{
    myMainWindowClass main_window(); // Step 1

    // Finish early if isFinished flag is set
    if (main_window.isFinished())
      return 0;

    main_window.show(); // Step 2
    return a.exec(); // Step 3
}


0 commentaires