Qt dans maya, c’est merveilleux, niveau interface graphique, c’est le top, ici, je parle bien sur des bindings PySide/PyQt.

On regrettera juste le passage un peu tardif à Qt5 (et la suppression définitive de PySide, qui devrais arriver avec la 2016, si je me suis bien renseigné), si tant est que ça arrive un jour (je suis impatient d’utiliser le QML dans maya…).

Mais bref, ici, je vous expose un ***** de problème…

C’est bien, on a fait toutes nos toolboxes et outils de prods en Qt (normal), sauf que pour certains clampins, je ne sais pas pourquoi, mais quand ils font un ctrl + v ou une majuscule, le focus de la fenêtre Qt passe a un focus vers maya (et donc, avec certains raccourcis, tels que le ctrl + v, on a des catastrophes…)

Je ne sais toujours pas à quoi c’est du, et franchement, pas le temps de m’attarder là dessus… Mais le problème arrive quand on initialise la fenêtre devant le viewport 3D, avec un objet sélectionné via l’outliner (autant dire, souvent, l’air de rien).

Maintenant, la solution: Overridez la méthode keyPressEvent de votre fenêtre (du moins, c’est la seule solution que j’ai trouvé, j’éditerais ce post si je trouve plus efficace ou si c’est foireux à la longue).

Pour ceux qui se poserais la question, vous garderez vos raccourcis de tous les widgets enfants (et donc des champs de saisie des enfants de la fenêtre), par contre, si vous l’implémentez sur un champ de texte directement, forcément, plus rien de marchera.

Ici, un exemple d’implémentation:

 

class MDockWidget(QDockWidget):
    def __init__(self, parent=None, **params):
        parent = parent or shiboken.wrapInstance(long(MQtUtil.mainWindow()), QMainWindow)
        QDockWidget.__init__(self, parent)

    def keyPressEvent(self, *args, **kwargs):
        """Because of fucking maya switch focus...
        """
        pass

Ou:

from PySide.QtGui import QWidget
w = QWidget()
w.keyPressEvent = lambda *args: ""
w.show()

En espérant que ça vous aide et que vous ne vous fassiez pas autant arracher la tête que moi par les graphistes en colère…