返回列表
mayaAPI

UI滑杆与数值联动

PySide6.QtWidgets:导入所有 Qt 控件,用于构建 UI 界面

PySide6.QtCore:导入 Qt 核心功能,方向控制、对齐方式

MayaQWidgetBaseMixin:Maya 官方提供的 UI 混入类,让自定义窗口能完美嵌入 Maya,避免窗口独立于软件外,同时继承 Maya 的 UI 风格

class sliderTool_1(MayaQWidgetBaseMixin, QDialog):
def __init__(self, parent=None):
super(sliderTool_1, self).__init__(parent)

1.继承 MayaQWidgetBaseMixinQDialog,创建 Maya 兼容的弹窗窗口类

2.super() 调用父类构造函数,初始化窗口基础属性

self.setWindowTitle("弹窗1:滑杆 + 普通输入框 联动演示")
self.setMinimumSize(400, 50) # 设置虚拟盒子宽高

# 创建虛擬盒子A,主虚拟盒子必须用self
boxA = QVBoxLayout(self)

# 创建虚拟盒子B
boxB = QHBoxLayout()

1.setWindowTitle:设置窗口标题,明确工具用途

2.setMinimumSize:限制窗口最小尺寸,避免 UI 控件被压缩变形

3.嵌套布局设计:

boxA:主垂直布局,作为窗口根布局

boxB:次级水平布局,用于横向排列标签、滑杆、输入框

self.label = QLabel("整数滑杆:")

# 创建信号发射器控件
# 创建滑杆,设置滑动范围,设置初始值
self.slider = QSlider(Qt.Horizontal)
self.slider.setRange(0, 100)
self.slider.setValue(0)

# 创建输入框,设置初始值
self.line_edit = QLineEdit()
self.line_edit.setText("20") # 设置默认值
# 输入框设置固定最小宽度,避免太窄
self.line_edit.setMinimumWidth(60)

1.QLabel:文本标签,用于说明滑杆功能

2.QSlider

*Qt.Horizontal:设置为水平方向

*setRange(0, 100):设置滑杆数值范围 0-100

*setValue(0):设置初始值

3.QLineEdit:输入框,设置默认值和最小宽度,避免过窄

# 按比例添加控件:标签(0) + 滑杆(95%) + 输入框(5%)
# addWidget(控件, 伸缩系数):数值越大,占比越高
boxB.addWidget(self.label, 10)
boxB.addWidget(self.slider, 75)
boxB.addWidget(self.line_edit, 15)
boxA.addLayout(boxB)

1.addWidgetstretch 参数:设置控件在布局中的伸缩比例,数值越大占比越高。

2.实现 “标签 - 滑杆 - 输入框” 的横向均匀排列,滑杆占比最大,保证交互区域充足。

# 创建桥
self.slider.valueChanged.connect(self.slider_changed)
self.line_edit.textChanged.connect(self.text_changed)

1.valueChanged:滑杆数值变化时触发信号,绑定到slider_changed函数

2.textChanged:输入框文本变化时触发信号,绑定到text_changed函数

3.实现双向联动:滑杆拖动时更新输入框,输入框输入时更新滑杆

def slider_changed(self, value):
value = str(value)
self.line_edit.setText(value) # 强制类型转换 a=1 float(a)

def text_changed(self, text):
value = int(text)
# 限制输入范围,避免超出滑杆范围
if 0 <= value <= 100:
self.slider.setValue(value)

1.slider_changed:将滑杆的整数数值转为字符串,同步到输入框

2.text_changed:

*将输入框文本转为整数

*加入范围校验,仅当数值在 0-100 内时,更新滑杆值,避免无效输入导致滑杆越界

global window1
window1 = sliderTool_1()
window1.show()

1.global 关键字:持有窗口引用,防止 Python 垃圾回收销毁 UI

2.实例化窗口类并调用show(),显示工具窗口

class sliderTool_2(MayaQWidgetBaseMixin, QDialog):
def __init__(self, parent=None):
super(sliderTool_2, self).__init__(parent)

用于实现垂直浮点数滑杆工具

self.setMinimumSize(80, 150)  # 设置虚拟盒子宽高
# 创建虛擬盒子A
boxA = QVBoxLayout(self)
boxB = QVBoxLayout()
boxC = QHBoxLayout()

1.设置更小的窗口尺寸,适配垂直滑杆布局。

2.嵌套布局:boxAboxBboxC,用于垂直滑杆居中排列。

self.slider = QSlider(Qt.Vertical)
self.slider.setRange(0, 100)
self.slider.setValue(50)

self.line_edit = QLineEdit()
self.line_edit.setText("0.5")
self.line_edit.setMinimumWidth(60)

self.Label = QLabel("小数数值:")

1.QSlider:设置为垂直方向,数值范围 0-100

2.输入框默认值设为0.5,对应滑杆初始值 50

boxC.addWidget(self.slider)
boxB.addLayout(boxC)
boxB.addWidget(self.Label, alignment= Qt.AlignCenter)
boxB.addWidget(self.line_edit, alignment=Qt.AlignCenter)
boxA.addLayout(boxB)

使用Qt.AlignCenter让标签和输入框在布局中水平 + 垂直居中,优化垂直滑杆的视觉效果

self.slider.valueChanged.connect(self.slider_changed)
self.line_edit.textChanged.connect(self.text_changed)

与整数滑杆一致,绑定双向联动信号

# 滑杆动 → 显示小数(除以100)
def slider_changed(self, value):
float_value = value / 100.0
self.line_edit.setText(f"{float_value:.2f}")

# 输入小数 → 滑杆跳动(乘以100)
def text_changed(self, text):
value = float(text)
self.slider.setValue(int(value * 100))

1.slider_changed:将滑杆整数除以 100 转为浮点数,保留两位小数同步到输入框

2.text_changed:将输入框浮点数乘以 100 转为整数,同步到滑杆,实现 0-1.0 浮点数与 0-100 整数的双向映射

global window2
window2 = sliderTool_2()
window2.show()

与整数滑杆一致,实例化并显示窗口

总结:实现了两个 Maya 自定义 UI 工具:

1.整数滑杆与输入框双向联动

2.垂直浮点数滑杆与输入框双向联动