使用以下方法很容易在时间滑块中获得高亮度范围:
import maya.cmds as cmds
import maya.mel as mel
aTimeSlider = mel.eval('$tmpVar=$gPlayBackSlider')
timeRange = cmds.timeControl(aTimeSlider, q=True, rangeArray=True)
同样可以使用
访问Qt小部件from maya import mel
from maya import OpenMayaUI as omui
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2 import __version__
from shiboken2 import wrapInstance
except ImportError:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide import __version__
from shiboken import wrapInstance
widgetStr = mel.eval( 'string $tempString = $gPlayBackSlider' )
ptr = omui.MQtUtil.findControl( widgetStr )
timeSliderWidget = wrapInstance(long(ptr), QWidget)
但是,以编程方式设置时间滑块的突出显示范围似乎几乎不可能。真的没办法吗?
我在想,可能有一种方法可以修改Qt小部件,但我在这个小部件上丢失了。
修改
答案 0 :(得分:0)
这似乎是与this question相同的问题。
我posted a hacky workaround there as an answer.
出于完整性考虑,也将其张贴在此处: 这是最大的黑客解决方法。使用Qt鼠标按下,移动和释放事件,以模仿时间滑块小部件上的鼠标行为以使其选择。
在代码中,我暂时更改了时间滑块范围,以最大化要单击的帧的屏幕空间。
from maya import mel
from maya import OpenMayaUI as omui
from shiboken2 import wrapInstance
from PySide2 import QtCore, QtGui, QtWidgets
def select_time_slider_range(start, end):
app = QtWidgets.QApplication.instance()
widgetStr = mel.eval('$gPlayBackSlider=$gPlayBackSlider')
ptr = omui.MQtUtil.findControl(widgetStr)
slider = wrapInstance(long(ptr), QtWidgets.QWidget)
slider_width = slider.size().width()
slider_height = slider.size().height()
# Store time slider settings
min_time = cmds.playbackOptions(query=True, minTime=True)
max_time = cmds.playbackOptions(query=True, maxTime=True)
animation_start_time = cmds.playbackOptions(query=True, animationStartTime=True)
animation_end_time = cmds.playbackOptions(query=True, animationEndTime=True)
t = cmds.currentTime(query=True)
# Set the time slider to the range we want so we have
# perfect precision to click at the start and end of the
# time slider.
cmds.playbackOptions(minTime=start)
cmds.playbackOptions(maxTime=end)
a_pos = QtCore.QPoint(0, slider_height / 2.0)
b_pos = QtCore.QPoint(slider_width, slider_height / 2.0)
# Trigger some mouse events on the Time Control
# Somehow we need to have some move events around
# it so the UI correctly understands it stopped
# clicking, etc.
event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove,
a_pos,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.NoModifier)
app.sendEvent(slider, event)
event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress,
a_pos,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.ShiftModifier)
app.sendEvent(slider, event)
event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove,
b_pos,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.ShiftModifier)
app.sendEvent(slider, event)
event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease,
b_pos,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.ShiftModifier)
app.sendEvent(slider, event)
event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove,
b_pos,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.MouseButton.LeftButton,
QtCore.Qt.NoModifier)
app.sendEvent(slider, event)
app.processEvents()
# Reset time slider settings
cmds.playbackOptions(minTime=min_time)
cmds.playbackOptions(maxTime=max_time)
cmds.playbackOptions(animationStartTime=animation_start_time)
cmds.playbackOptions(animationEndTime=animation_end_time)
cmds.currentTime(t)
select_time_slider_range(-200, 500000)