在 Maya 的时间滑块中设置高亮范围

Set highlighted range in Maya's Time Slider

使用以下方法很容易在时间滑块中获取高亮范围:

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 小部件,但我迷失了这个。

编辑:

这是我试图以编程方式设置的突出显示范围。

这似乎是与 相同的问题。

为了完整起见,也将其张贴在这里: 这是最大的 hacky 解决方法。使用 Qt Mouse 按下、移动和释放事件来模拟鼠标在时间滑块小部件上的行为以获得它 select。

在代码中,我临时更改了时间滑块范围以最大化屏幕 space 我想要单击的帧。

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)