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.继承 MayaQWidgetBaseMixin 和 QDialog,创建 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.addWidget 的 stretch 参数:设置控件在布局中的伸缩比例,数值越大占比越高。
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.嵌套布局:boxA→boxB→boxC,用于垂直滑杆居中排列。
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.垂直浮点数滑杆与输入框双向联动