Maya Pyside2 UI,无法让 QPushButton 与同一类中的函数连接



我试图用pyside2为玛雅编写一个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() ;

,所以我设法运行了命令。我使用嵌套函数连接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 ) ;

我真的不知道这里发生了什么。我觉得这是必经之路,这更像是鸭子胶带解决方案。

,如果有人可以解释这里发生的事情,那将是很棒的。

谢谢!

最简单的解决方案是使您的gui变量全局:

def run ( *args ) :
    global gui
    gui = Gui() ;
    gui.show() ;

通常,当没有内存持有内存时(例如在类中使用self(,QT对象会被删除,因此我假设它正在以您创建的方式删除一些连接。

这感觉就像是创可贴,可能正在掩盖一些主要问题,尤其是对于更复杂的界面。

通常,您的主类实际上应该从QObject继承,主要是以下一个:QDialogQMainWindowQWidget。同样重要的是,用self声明从QObject继承的所有对象,以便它们成为实例变量,并且可以在整个类中访问。否则,您冒着在垃圾收集期间被删除的物体的风险,因为它不属于任何东西,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的编码标准。删除所有半彩色(;(,因为它极其非pythonic,看起来像一个结肠(:),非常令人困惑。由于占用不必要的空间,因此缩小了白色空间中的差距,并使其更加可读。不要将骆驼与蛇命名命名混合,选择一个或另一个。当其他人很难阅读它时,开发自己的风格是没有意义的:D

最新更新