2017-05-31 9 views
0

Bonjour, dans mon application sur MacOSX je veux donner à l'utilisateur l'option "réduire au plateau". J'utilise Qt5 et j'ai réécrit la fonctionRéduire au plateau sur MacOSX

changeEvent(QEvent *event) 

. Là, je fais quelque chose comme

switch(event->type()) 
{ 
case QEvent::WindowStateChange: 
    { 
     if (this->windowState() & Qt::WindowMinimized) { 
      if(*option minimize to tray enable*) { 
       event->ignore(); 
       QTimer::singleShot(0, this, SLOT(hide())); 
      } 
     } 
     break; 
    } 
default: 
    break; 
} 

Eh bien, il fonctionne sur Linux et Windows, mais le problème est que dans MacOSX ce code ne fonctionne pas correctement et crée un bug. En effet la fenêtre est toujours minimisée dans la barre des tâches (en dehors du dock) et de plus, si la fenêtre est redimensionnée à partir de la barre des tâches au lieu de l'icône de la barre, l'interface graphique est bloquée et ne change pas. L'interface graphique peut toujours envoyer des signaux mais elle ne peut pas changer. Je dois reshow la fenêtre de l'icône de plateau pour débloquer l'interface graphique. Puis la question: Comment puis-je éviter de réduire la fenêtre dans la barre des tâches sur MacOSX? Une autre question connexe: J'ai lu un forum où un utilisateur parle d'un "comportement standard" dans MacOSX, comme par exemple ne pas fermer l'application quand on clique sur le bouton "x", ou ne pas utiliser l'icône de plateau ecc . ecc .... Quelqu'un peut poster un lien officiel comment une application devrait se comporter dans MacOSX?

Merci beaucoup à tout le monde

Répondre

1

Eh bien, je ne sais pas Qt, mais je sais très bien Cocoa. Parlant en termes de l'API Objective-C, votre appel hide() est probablement l'équivalent de -orderOut:. Malheureusement, -orderOut: ne fonctionne pas correctement pour les fenêtres réduites. Il laisse une fenêtre "fantôme" dans le Dock, qui peut être réduite à une fenêtre fantôme réelle. C'est, c'est juste une image de la fenêtre, ce n'est pas la fenêtre réelle en direct.

Il fonctionne pour appeler -close. Je ne sais pas ce que serait l'équivalent Qt. Vous devez faire attention à éviter certaines des conséquences secondaires que -close a au-delà de ceux de -orderOut:, cependant. Par exemple, certaines fenêtres sont définies pour se libérer à la fermeture, que vous souhaitez désactiver. En outre, la méthode -windowWillClose: du délégué de fenêtre sera appelée et elle ne devrait rien faire pour un appel ne se terminant pas vraiment.

Ne vous inquiétez pas que «fermeture» est plus sévère ou permanente que «cacher» ou «sortir». C'est vraiment à peu près la même chose, à part les conséquences supplémentaires mentionnées ci-dessus. Par exemple, il est toujours possible de réafficher une fenêtre qui a été fermée, etc.

La question est de savoir si Qt vous donne la possibilité de le faire. Alternativement, cela peut être considéré comme un bug dans Qt, que son implémentation hide() utilise -orderOut: plutôt que -close sur les fenêtres minimisées.

Enfin, je vous demanderai si vous voulez réellement implémenter cette fonctionnalité. Ça va dérouter les utilisateurs. Lorsque vous réduisez une fenêtre, elle anime la minimisation dans le Dock. Cela donne à l'utilisateur une forte impression de l'endroit où trouver la fenêtre. Si la fenêtre n'est pas trouvée par la suite, l'utilisateur ne saura pas chercher ailleurs. De même, Exposé/Mission Control montre aux utilisateurs les fenêtres réduites d'une application en plus des fenêtres normales. Vos fenêtres censées être réduites au minimum ne s'afficheront pas car elles ne sont plus réellement réduites au minimum.

Peut-être juste désactiver la minimisation. Demandez à l'utilisateur de simplement fermer la fenêtre une fois terminé et de l'ouvrir de nouveau à partir de votre menu d'éléments d'état.

+0

mmm merci pour le commentaire.La chose étrange est que l'application a également une option "proche du plateau", et cela fonctionne bien. Mais j'utilise la même fonction Qt "hide()". Je vais enquêter sur ce que vous dites sur la différence entre close et orderOut. Merci. – n3mo

+0

Eh bien, si 'hide()' est un wrapper autour de '-orderOut:', alors cela fonctionnerait bien pour "close to tray". Comme je le dis, '-close' et' -orderOut: 'sont vraiment très similaires, sauf pour quelques cas de coin. Vraisemblablement, la fenêtre n'est pas minimisée dans le cas du "close to tray", donc l'une de ces différences ne serait pas pertinente. –