You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide2导入UI文件后无法修改Label文本的问题求助

问题解决:PySide2+Maya中事件过滤器修改UI控件失效

问题根源

你代码里的核心错误是事件过滤器中创建了新的MainWindow实例:在Filter.eventFilter里执行win = MainWindow(),调用这个新实例的labelTest方法,只会修改新窗口的Label,而不是当前显示在Maya中的那个窗口的控件,所以点击按钮后看不到任何变化。

另外代码里遗漏了maya.cmds的导入,会导致cmds.select报错,需要补充。

解决方法

让事件过滤器能够获取到当前正在显示的MainWindow实例,最直接的方式是在创建Filter时,把主窗口实例作为参数传递进去,保存为Filter的实例变量。

修改后的完整代码

from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore
from PySide2.QtUiTools import QUiLoader
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
import shiboken2 as shiboken
import os
import maya.cmds as cmds  # 补充cmds导入

UIFILEPATH = 'D:/MAYA/pyside_pick/ui/PicsTest5.ui'

class MainWindow(MayaQWidgetBaseMixin,QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)
        
        self.UI = QUiLoader().load(UIFILEPATH)
        
        self.setWindowTitle(self.UI.windowTitle())
        
        self.setCentralWidget(self.UI)
        #image
        img = QtGui.QPixmap('D:/MAYA/pyside_pick/images/imgKohaku.png')
        self.scene = QtWidgets.QGraphicsScene(self)
        item = QtWidgets.QGraphicsPixmapItem(img)
        self.scene.addItem(item)
        self.UI.graphicsView_char_1.setScene(self.scene)

        #filter:修改处——创建Filter时传入当前主窗口实例
        self._filter = Filter(self)
        self.installEventFilter(self._filter)
        self.UI.pSphere1.installEventFilter(self._filter)
        
        #primary
        self.UI.label.setStyleSheet("QLabel {color : white;}")
        self.UI.label.setText("A")
        
    def labelTest(self):
        self.UI.label.setStyleSheet("QLabel {color : red;}")
        self.UI.label.setText("B")
        print('D')
        return False
     
    
class Filter(QtCore.QObject):
    # 修改处——添加初始化参数,保存主窗口引用
    def __init__(self, main_window):
        super().__init__()
        self.main_window = main_window
        
    def eventFilter(self, widget, event):
        # 移除新建MainWindow的代码
        if event.type() == QtCore.QEvent.MouseButtonPress:
            print(widget.objectName())
            cmds.select(widget.objectName())
            # 修改处——调用保存的主窗口实例的方法
            self.main_window.labelTest()
        return False
        
def main():
    win = MainWindow()
    win.show()
    
if __name__ == '__main__':
    main()

关键修改点

  1. 给Filter类添加初始化参数,接收主窗口实例并保存
  2. 在MainWindow创建Filter时,传入自身实例self
  3. 移除eventFilter中新建MainWindow的代码,改用保存的主窗口实例调用labelTest
  4. 补充maya.cmds的导入,避免cmds.select报错

内容的提问来源于stack exchange,提问作者Sechs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:10:36