2017-10-11 1 views
0

J'ai une application qui fonctionne à la fois sur Windows et Mac. L'application est écrite en QML. Le composant le plus externe de mon code QML est un ApplicationWindow. L'API du composant ApplicationWindow a une propriété appelée menuBar. Voici un exemple fictif, qui reproduit cela avec un MenuBar et quitter Action:Comment QML gère-t-il la sortie de l'application de la barre de menu sur Mac?

ApplicationWindow { 
    id: _applicationWindow 

    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    Component.onCompleted: { 
     console.info("ApplicationWindow completed.") 
    } 

    menuBar: MenuBar { 
     Menu { 
      title: "File" 

      MenuItem { 
       action: Action { 
        id: _myQuttingAction 

        text: "Quit MyApp" 
        shortcut: "Ctrl+Q" 

        onTriggered: { 
         // deinit... 
         console.info("I got called!") 
         Qt.quit() 
        } 
       } 
      } 
     } 
    } 
} 

Quand je lance mon application sur Mac les titres haut de la barre de menus suivants apparaissent:

Apple Icon menu | MyApp | File

Si Je décroche le menu "Fichier" c'est ce que je reçois: MyApp's "File" menu drop down

Comme vous pouvez le voir le menu déroulant est vide. En fait, il n'est pas vide car il est pressable et si je le presse, il quitte mon application avec tous les appels deinit dans l'événement onTriggered de l'action.

Si je descends le menu "MyApp", en bas je vois "Quitter MyApp" avec le raccourci Cmd+Q. Si j'appuie sur ceci, cela ferme aussi mon application, mais sans appeler l'événement onTriggered de mon action, ainsi ma vraie application se bloque à la fermeture.

Malheureusement, en appuyant sur Cmd+Q appelle également le quitter de la "MyApp" pas mon action spécifiée.

Sous Windows, je n'ai pas ce problème du tout et "Quit MyApp" apparaît dans le menu "Fichier" et fait ce que je m'attends à faire.

J'ai essayé de google ce problème et j'ai lu la documentation sans succès pour le moment. Quelqu'un sait ce qui se passe ici?

Répondre

2

Il n'est pas réaliste de s'attendre à ce que l'arrêt de Qt utilise de façon magique votre action de menu particulière, qui est complètement facultative et arbitraire.

Il est possible que ce ne soit pas votre raccourci qui appelle l'action, mais quelque chose de construit qui soit spécifique à la plate-forme, comme par exemple comment Alt + F4 fonctionne sur Windoze.

Puisque vous utilisez ApplicationWindow vous pouvez implémenter un gestionnaire de sortie personnalisé, qui sera utilisé quelle que soit la façon dont vous quittez l'application:

onClosing: { 
    // do your stuff 
    close.accepted = true // exits, if set to false the quit request will be ignored 
    } 

Mise à jour: Puisque vous dites que le code ci-dessus ne fonctionne pas comme prévu, l'abandon doit se faire à un niveau encore plus bas qui ne notifie même pas qtquick, ce qui pourrait aussi expliquer le crash. Je n'ai pas actuellement de machine macos pour l'étudier, mais il y a de bonnes chances que vous puissiez l'obtenir pour quitter la propriété en accrochant un gestionnaire au signal QCoreApplication::aboutToQuit().

+0

Salut @dtech, le réglage 'close.accepted = false' fait que mon application quitte, même en essayant avec mon exemple factice ci-dessus. – Silex

+0

Pourquoi la chaîne "Quitter MyApp" n'apparaît-elle pas dans le menu "Fichier"? – Silex

+0

@Silex voir la mise à jour, sauf que je suis actuellement à court d'idées, quelqu'un d'autre pourrait être en mesure d'aider. – dtech