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();
}
}
4 Réponses :
tr code> est un Membre statique public de qobject. Vous devriez pouvoir appeler qObject :: tr ("erreur") code> dans votre fonction principale. P>
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. P>
Si cela ne fonctionne pas, vous pouvez toujours essayer de détruire (vrai, vrai) la fenêtre avec des sous-fenêtres. P>
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()));
QMetaObject :: Invokemethod (Ceci, "Fermer", Qt :: QueueConnection); Code> 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.
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
}