我正在尝试使用Pyside2为Maya编写UI,但是由于某些原因,我无法将QPushButton与同一类中的函数连接。
在这种情况下,我编写了一个带有1个按钮的简单UI,以触发同一类中的template_btnCmd。
谢谢。
import pymel.core as pm ;
import maya.OpenMayaUI as mui ;
from PySide2 import QtCore , QtGui , QtWidgets ;
from shiboken2 import wrapInstance ;
class Gui ( object ) :
def __init__ ( self ) :
super ( Gui , self ).__init__() ;
self.ui = 'template_uiE' ;
self.w = 500.00 ;
self.h = 300.00 ;
def deleteUI ( self , ui ) :
if pm.window ( ui , ex = True ) :
pm.deleteUI ( ui ) ;
self.deleteUI ( ui ) ;
def show ( self ) :
self.deleteUI ( self.ui ) ;
# Pointer
mayaMainWindow_ptr = mui.MQtUtil.mainWindow();
mayaMainWindow = wrapInstance(long(mayaMainWindow_ptr), QtWidgets.QWidget);
self.mayaMainWindow_ptr = mayaMainWindow_ptr;
self.mayaMainWindow = mayaMainWindow;
window = QtWidgets.QWidget(parent=mayaMainWindow);
self.window = window;
window.setObjectName(self.ui);
window.resize(self.w, self.h);
window.setWindowFlags(QtCore.Qt.Window);
main_QHBoxLayout = QtWidgets.QHBoxLayout(window);
main_QHBoxLayout.setObjectName('main_QHBoxLayout_uiE');
self.main_QHBoxLayout = main_QHBoxLayout;
### Grid Layout
button_QPushButton = QtWidgets.QPushButton() ;
button_QPushButton.setObjectName ( 'button_QPushButton_uiE' ) ;
button_QPushButton.setText ( 'Template Button' ) ;
button_QPushButton.clicked.connect ( self.template_btnCmd ) ;
# --> Insert
main_QHBoxLayout.addWidget ( button_QPushButton ) ;
window.show() ;
def template_btnCmd ( self ) :
print ( 'This is working...?' ) ;
def run ( *args ) :
gui = Gui() ;
gui.show() ;
run() ;
答案 0 :(得分:0)
所以我设法运行了命令。我不是使用嵌套函数来连接QPushButton,而是直接将函数连接到QPushButton。
button_QPushButton = QtWidgets.QPushButton() ;
button_QPushButton.setObjectName ( 'button_QPushButton_uiE' ) ;
button_QPushButton.setText ( 'Template Button' ) ;
def template_btnCmd ( *args ) :
self.template_btnCmd() ;
button_QPushButton.pressed.connect ( template_btnCmd ) ;
# --> Insert
main_QHBoxLayout.addWidget ( button_QPushButton ) ;
我真的不知道这里发生了什么。我不认为这是要走的路,这更像是鸭子磁带解决方案。
如果任何人都可以解释这里发生的事情,那就太好了。
谢谢!
答案 1 :(得分:0)
最简单的解决方案是将您的gui
变量设为全局变量:
def run ( *args ) :
global gui
gui = Gui() ;
gui.show() ;
通常,当没有内存时(例如在类中使用self
),Qt对象将被删除,因此我假设它正在以创建方式删除某些连接。
这感觉像是一个创可贴,可能掩盖了一些主要问题,尤其是对于更复杂的界面而言。
通常,您的主类实际上应该继承自QObject
,主要是以下之一:QDialog
,QMainWindow
,QWidget
。用QObject
声明从self
继承的所有对象也很重要,这样它们就成为实例变量并且可以在整个类中访问。否则您可能会在垃圾回收期间删除该对象,因为它不属于任何对象,并且Python认为您已经完成了操作。
最后看起来像这样:
import pymel.core as pm
import maya.OpenMayaUI as mui
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
from shiboken2 import wrapInstance
class Gui(QtWidgets.QWidget):
def __init__(self):
self.ui = 'template_uiE'
self.w = 500.00
self.h = 300.00
self.deleteGui(self.ui)
# Pointer
mayaMainWindow_ptr = mui.MQtUtil.mainWindow()
mayaMainWindow = wrapInstance(long(mayaMainWindow_ptr), QtWidgets.QWidget)
super(Gui, self).__init__(mayaMainWindow)
self.setObjectName(self.ui)
self.resize(self.w, self.h)
self.setWindowFlags(QtCore.Qt.Window)
# Grid Layout
self.button_QPushButton = QtWidgets.QPushButton()
self.button_QPushButton.setObjectName('button_QPushButton_uiE')
self.button_QPushButton.setText('Template Button')
self.button_QPushButton.clicked.connect(self.template_btnCmd)
# --> Insert
self.main_QHBoxLayout = QtWidgets.QVBoxLayout()
self.main_QHBoxLayout.addWidget(self.button_QPushButton)
self.setLayout(self.main_QHBoxLayout)
def deleteGui(self, ui):
if pm.window(ui, ex=True):
pm.deleteUI(ui)
def template_btnCmd(self):
print 'This is working...?'
def run(*args):
gui = Gui()
gui.show()
run()
关于编码标准的一些话:请坚持使用PEP8或Google's coding standards。删除所有分号(;),因为它非常不符合Python风格,并且看起来像冒号(:),这非常令人困惑。填补空白处的空白,因为它会占用不必要的空间并使它更不可读。请勿将camelCase与snake_case命名混合使用,请选择其中一个。当别人很难阅读自己的风格时,发展自己的风格毫无意义:D