Пользовательский интерфейс Maya Pyside2, не удалось подключить QPushButton к функции в том же классе - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь написать пользовательский интерфейс с Pyside2 для Maya, но по какой-то причине я не смог соединить QPushButton с функцией в том же классе.

В этом случае я написал простой пользовательский интерфейс с 1 кнопкой для запуска 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() ;

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Самое простое решение - сделать переменную gui глобальной:

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

Обычно объекты Qt удаляются, когда память не удерживается (например, использование self в классе), поэтому я предполагаю, что он удаляет некоторые соединения так, как вы его создаете.

Это похоже на пластырь и может маскировать некоторые серьезные проблемы, особенно для более сложных интерфейсов.

Как правило, ваш основной класс должен на самом деле наследовать от 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 . Удалите все точки с запятой (;), так как это крайне непифоново и выглядит как двоеточие (:), это очень запутанно. Закройте пробел в вашем пустом пространстве, так как он занимает ненужное пространство и делает его более нечитаемым. Не смешивайте camelCase с именами snake_case, выбирайте одно или другое. Нет смысла развивать свой собственный стиль, когда другим трудно его прочитать: D

0 голосов
/ 11 мая 2019

Итак, мне удалось запустить команду.Вместо непосредственного подключения функции к 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 ) ;

Я действительно не знаю, что здесь происходит.Я не чувствую, что это путь, и это больше похоже на решение для утиной ленты.

И если кто-нибудь сможет объяснить, что здесь происходит, было бы здорово.

Спасибо!

...