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()
关键修改点
- 给
Filter类添加初始化参数,接收主窗口实例并保存 - 在
MainWindow创建Filter时,传入自身实例self - 移除
eventFilter中新建MainWindow的代码,改用保存的主窗口实例调用labelTest - 补充
maya.cmds的导入,避免cmds.select报错
内容的提问来源于stack exchange,提问作者Sechs
相关产品推荐
相关产品推荐

