QSliderでドラッグ中に処理しても1回のUndoで戻れるようにする方法

takkun
どうも!たっくんです!

Mayaでスライダーを動かすたびにアクションさせたいけど、何も考えずにやってしまうと大量のヒストリーが書き込まれてしまい1回のUndoで戻れなくなってしまします・・・(´・ω・`)

できれば「cmds.attrFieldSliderGrp」のように、スライダーを動かすとリアルタイムに処理されて、スライダーを離すと確定し、1回のUndoでも出れるようにしたい!

PySideのQSliderでそのような実装するにはどうしたらいいかご紹介したいと思います!

QSliderの実装

QSliderには、スライダーをクリックした時「sliderPressed」、スライダーを動かしている時「sliderMoved」、スライダーを離した時「sliderReleased」の便利なシグナルがあります。

sliderPressedにヒストリーの始まり、sliderMovedに実際の処理、sliderReleasedにヒストリーの終わりの処理を書くことで、「cmds.attrFieldSliderGrp」のような実装が可能になります!

from maya import cmds
from PySide2 import QtWidgets

class Slider(QtWidgets.QSlider):
	def __init__(self, *args, **kwargs):
		super(Slider, self).__init__(*args, **kwargs)

		self.sliderPressed.connect(self.dragStart)
		self.sliderReleased.connect(self.dragEnd)

	def dragStart(self):
		cmds.undoInfo(openChunk=True)
	
	def dragEnd(self):
		cmds.undoInfo(closeChunk=True)
		
slider = Slider()
slider.sliderMoved.connect(処理したい関数・メソッド)

実際に使うときに3つもシグナルをコネクションするのはめんどくさいので、ヒストリーの始まり・終わりの処理はクラス内で完結させ、スライダーを動かしているときの処理だけコネクションするようにしました!