MayaでPySideを使ったツールを作っていると、QLineEditをよく使うと思います。だけどQLineEditをそのまま使うと、ちょっとトラップがあります。
それがコチラ!
Outlinerで、ノードの名前をコピーしてQLineEditにペーストしようとすると、Ctrlを押したところでフォーカスがView Portに飛んでしまい、「Ctrl+V」の動作がMayaに取られてしまいます。
上記の動画では、一度もMayaでコピペしたことがないのでエラーしましたが、以前にコピーしたモデルなどがペーストされると、相当ウザイ状況ですよね、、、(;´∀`)
何より、文字もペーストできんのか!っと怒られてしまいます、、、(゚A゚;)
Ctrl以外にも、Shiftキーでも同様のフォーカスズレが起きてしまいます。どうやら、ツールのQLineEditの前に、Mayaのどこにフォーカスがあったかが重要のようです。
そこで、不具合を対応したQLineEditを作ってみたいと思います!
クラスの骨格
まずは、Ctrl、Shiftが押された時に、Maya側にカーソルが飛ばないように「keyPressEvent」をオーバーライドしたクラスを用意したいと思います。
from PySide import QtGui class LineEdit(QtGui.QLineEdit): def keyPressEvent(self, event): pass
keyPressEventの実装
続いて、Ctrl、Shiftが単体で押された時に、何もなかったことにしたいと思います。何もおきないようにすれば、Maya側にカーソルが飛ばないっという読みです。
from PySide import QtCore from PySide import QtGui class LineEdit(QtGui.QLineEdit): def keyPressEvent(self, event): key = event.key() if key == QtCore.Qt.Key.Key_Control or key == QtCore.Qt.Key.Key_Shift: return super(LineEdit, self).keyPressEvent(event)
上記のコードのようにすることで、Ctrl、Shift単体を検出して何もしないようにしています。それ以外のキーは、基底クラスの処理を行うようにして支障が出ないようにしています。
ツールでは「QLineEdit」ではなく、こちらの「LineEdit」を使うようにすれば、Ctrl、Shiftの問題が解決するかと思います!(`・ω・´)ゞ