J'ai une classe (Window) qui hérite de QWidget (pas QMainWindow). C'est la partie importante de ma fonction principale.

 QApplication app (argc, argv);

 QMainWindow *window = new QMainWindow;

 QMenuBar *tool_bar = new QMenuBar (window);

 Window *graph_area = new Window (arguments);

 window->setMenuBar (tool_bar);
 window->setCentralWidget (graph_area);
 window->show ();
 app.exec ();

J'ai pensé que je remplacerais simplement "closeEvent", mais pour une raison quelconque, il n'est pas appelé lorsque vous appuyez sur le bouton de fermeture.

Je souhaite empêcher l'utilisateur de fermer l'application si un processus fonctionne toujours.

Des idées sur la façon dont je pourrais y parvenir?

1
vowchick 2 sept. 2020 à 23:32

3 réponses

Meilleure réponse

Vous pouvez soit :

  1. Sous-classe QMainWindow, au lieu de QWidget

  2. Remplacer QMainWindow::closeEvent, au lieu de QWidget::closeEvent

  3. Allouez votre sous-classe QMainWindow sur la pile, plutôt que sur le tas, c'est-à-dire:

     MyMainWindowSubclass window;
    

ou :

Changez votre code pour:

QApplication app(argc, argv);

Window w;

window->show();

app.exec();

Et Window::closeEvent sera appelé.

1
scopchanov 2 sept. 2020 à 22:06

J'ai effectivement trouvé une autre solution à mon problème, que je trouve plus agréable. Je peux créer une mainwindow de classe personnalisée qui hérite de QMainWindow et l'utiliser à la place de QMainWindow. Cela pourrait être plus approprié, car j'aurai probablement également besoin d'autres modifications de QMainWindow.

0
vowchick 3 sept. 2020 à 05:31

Faites de votre classe Window un filtre d'événement et installez-le sur l'objet de la fenêtre principale. Vous allez réimplémenter la méthode filterEvent dans Window. N'oubliez pas de l'installer sur la fenêtre principale! Et assurez-vous que le filtre filtre l'événement - le résultat booléen indique si vous laissez passer le résultat ou si vous le filtrez. Recherchez la valeur exacte nécessaire pour indiquer l’un ou l’autre - c’est une mauvaise API et je ne me souviens jamais si vrai ou faux correspond à mon intention. C’est un cas classique où une valeur de retour d’énumération fonctionnerait mieux, comme Qt::Accept / Qt::Reject ou quelque chose du genre.

1
Unslander Monica 2 sept. 2020 à 23:01