如何将QComboBox改造为带复选框的下拉控件?(Maya Qt环境)
Maya Qt 带复选框下拉控件实现方案
原生Qt的QComboBox默认是单选交互,可通过修改列表项标志、自定义事件处理的方式实现复选效果,适配Maya的PySide2/PySide6环境,具体实现步骤如下:
步骤1:修改现有下拉项的可勾选属性
给每个添加的列表项开启可勾选标记,初始化未勾选状态:
from PySide2 import QtCore, QtWidgets # 你原有的控件初始化逻辑 self.transform_dropdown = QtWidgets.QComboBox() self.transform_dropdown.addItem("Freeze transform") self.transform_dropdown.addItem("Freeze rotation") self.transform_dropdown.addItem("Freeze scale") # 给所有下拉项添加可勾选属性 for i in range(self.transform_dropdown.count()): item = self.transform_dropdown.model().item(i, 0) # 追加项标志:可选、可勾选、可用 item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) # 初始化勾选状态为未勾选 item.setCheckState(QtCore.Qt.Unchecked)
步骤2:覆盖默认单选交互逻辑
默认QComboBox点击任意项会直接收起下拉框并选中该项,需要绑定事件过滤器拦截点击事件,实现点击切换勾选状态且不自动收起下拉框:
# 给下拉列表视图绑定事件过滤器 self.transform_dropdown.view().installEventFilter(self) # 在你的控件类中添加如下事件过滤方法 def eventFilter(self, obj, event): if obj == self.transform_dropdown.view() and event.type() == QtCore.QEvent.MouseButtonRelease: # 获取点击的项索引 index = obj.indexAt(event.pos()) if index.isValid(): # 切换当前项的勾选状态 item = self.transform_dropdown.model().itemFromIndex(index) item.setCheckState(QtCore.Qt.Checked if item.checkState() == QtCore.Qt.Unchecked else QtCore.Qt.Unchecked) # 阻止事件继续传递,避免下拉框自动收起 return True return super().eventFilter(obj, event)
如果不想修改父类的eventFilter方法,也可以自定义继承QComboBox的复选下拉子类,把上述逻辑封装在子类内部复用。
步骤3:查询勾选状态
需要获取勾选结果时,遍历所有下拉项判断勾选状态即可:
def get_checked_items(self): checked_list = [] for i in range(self.transform_dropdown.count()): item = self.transform_dropdown.model().item(i, 0) if item.checkState() == QtCore.Qt.Checked: checked_list.append(item.text()) return checked_list # 调用示例:print(get_checked_items()) 会返回所有已勾选的选项文本
适配说明:Maya2025及以上版本使用的是PySide6,仅需把导入语句的
PySide2替换为PySide6即可,其余逻辑完全兼容。
内容的提问来源于stack exchange,提问作者Michael Isaakidis
相关产品推荐
相关产品推荐

