Maya PySide: Maya аварийно завершает работу, когда я пытаюсь подключить пользовательский сигнал к слоту

Я занимаюсь PySide около 2 недель, и мне это нравится, но у меня проблемы с пониманием некоторых более промежуточных концепций. Любая помощь будет принята с благодарностью.

Я пытаюсь заставить несколько пользовательских QEvents работать в PySide с помощью QLineEdit и QCompleter. Я использую старый стиль для соединений сигнал/слот, потому что я еще не нашел ресурса, который действительно объясняет новый синтаксис, но я думаю, что именно в этом и заключается моя проблема.

Когда я закомментирую соединение, Maya не рухнет. Как только я снова включаю его, Maya вылетает всякий раз, когда я нажимаю вкладку.

Любая помощь будет принята с благодарностью!

Спасибо!

from PySide import QtCore, QtGui
from shiboken import wrapInstance 
import maya.OpenMayaUI as mui

def maya_main_window():
    ptr = mui.MQtUtil.mainWindow()
    return wrapInstance( long( ptr ), QtGui.QWidget )   

####################################################################
class MyWindow(QtGui.QDialog): 
    def __init__( self, parent=maya_main_window() ):
        super( MyWindow, self ).__init__( parent )

        # create objects
        self.la = QtGui.QLabel("Press tab in this box:")
        self.le = MyLineEdit()
        self.wordList = ["hi", "bye", "yes", "lane"]
        self.completer = QtGui.QCompleter( self.wordList, self )
        self.completer.setCompletionMode(QtGui.QCompleter.UnfilteredPopupCompletion)
        self.la2 = QtGui.QLabel("\nLook here:")
        self.le2 = QtGui.QLineEdit()
        self.le.setCompleter(self.completer)

        # layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        layout.addWidget(self.la2)
        layout.addWidget(self.le2)
        self.setLayout(layout)

        #####################
        # connections
        #####################
        self.connect(self.le, QtCore.SIGNAL("tabPressed"), self.on_tab)
        self.connect(self.le, QtCore.SIGNAL("escPressed"), self.on_esc)

        #####################
        # proper new style?
        #####################
        #self.le.tab_event.connect(self.on_tab)
        #self.le.esc_event.connect(self.on_tab)

    ######################
    # Slots
    ######################
    def on_tab(self):
        # I'd like tab to have the same function as arrow down
        print "tabbed"

    def on_esc(self):
        self.close()


####################################################################
class MyLineEdit( QtGui.QLineEdit):

    def __init__(self, parent=maya_main_window()):
        super( MyLineEdit, self ).__init__( parent  )

    ########################
    # Custom Signals
    ########################
    def tab_event(self, event):
        if (event.type()==QtCore.QEvent.KeyPress) and (event.key()==QtCore.Qt.Key_Tab):
            self.emit(QtCore.SIGNAL("tabPressed"))
            return True

        return QtGui.QLineEdit.event(self, event)

    def esc_event(self, event):
        if (event.type()==QtCore.QEvent.KeyPress) and (event.key()==QtCore.Qt.Key_Escape):
            self.emit(QtCore.SIGNAL("escPressed"))
            return True



####################################################################
if __name__ == "__main__": 
    # Development stuff
    try:
        myWindow_ui.close()
        myWindow_ui.deleteLater()
    except:
        pass


    myWindow_ui = MyWindow()
    myWindow_ui.show()


    # Development stuff
    try:
        myWindow_ui.show()
    except:
        myWindow_ui.close()
        myWindow_ui.deleteLater()

person Mike Bourbeau    schedule 11.06.2015    source источник
comment
Этот вопрос на самом деле 4 вопроса. Старайтесь, чтобы вопросы были сосредоточены на одной проблеме за раз, чтобы отвечающие и пользователи сайта могли извлечь из этого больше пользы.   -  person kartikg3    schedule 12.06.2015
comment
Также во всем посте вы не упомянули сбой Maya. Вы просто упоминаете, что получаете ошибку, хотя в заголовке говорите, что Maya дает сбой. Что происходит на самом деле? И снова постарайтесь сфокусировать вопрос на одной проблеме.   -  person kartikg3    schedule 12.06.2015
comment
Извините, это мой первый пост :/ На самом деле я ответил на свой вопрос прошлой ночью, поэтому я опубликую ответ через секунду. Я внесу некоторые изменения в свой исходный пост, чтобы все было актуально.   -  person Mike Bourbeau    schedule 12.06.2015
comment
Здорово! Было бы здорово, если бы вы могли опубликовать ответ.   -  person kartikg3    schedule 12.06.2015


Ответы (1)


Я думаю, что моя проблема была связана со стилем, в котором я соединял сигнал и слот. Я нашел этот замечательный пост < /a>, который проведет вас по новому стилю.

Я создал несколько переменных перед конструктором MyLineEdit. Затем я использовал эти переменные в функции tab_event. Затем я подключил сигнал к слоту с новым синтаксисом подключения.

Вот обновленный код с комментариями:

from PySide import QtCore, QtGui
from shiboken import wrapInstance 
import maya.OpenMayaUI as mui

def maya_main_window():
    ptr = mui.MQtUtil.mainWindow()
    return wrapInstance( long( ptr ), QtGui.QWidget )   

####################################################################
class MyWindow(QtGui.QDialog): 
    def __init__( self, parent=maya_main_window() ):
        super( MyWindow, self ).__init__(  )

        # create objects
        self.la = QtGui.QLabel("Press tab in this box:")
        self.le = MyLineEdit()
        self.la2 = QtGui.QLabel("\nLook here:")
        self.le2 = QtGui.QLineEdit()

        # layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        layout.addWidget(self.la2)
        layout.addWidget(self.le2)
        self.setLayout(layout)

        # connections
        # Bad syntax
        #self.connect(self.le, QtCore.SIGNAL("tabPressed"), self.update)
        # Correct syntax
        self.le.tab_pressed.connect(self.update)

    # Slot   
    def update(self):
        newtext = str(self.le2.text()) + "tab pressed "
        self.le2.setText(newtext)

####################################################################
class MyLineEdit( QtGui.QLineEdit):

    # Create variables before the constructor
    tab_pressed = QtCore.Signal(str)
    signal_str = "tabPressed"

    def __init__(self, parent=None):
        super( MyLineEdit, self ).__init__(   )

    # Signal
    def event(self, event):

        # Variables inserted
        if (event.type()==QtCore.QEvent.KeyPress) and (event.key()==QtCore.Qt.Key_Tab):
            self.tab_pressed.emit(self.signal_str)
            return True

        return QtGui.QLineEdit.event(self, event)

####################################################################
if __name__ == "__main__": 
# Development stuff
    try:
        myWindow_ui.close()
        myWindow_ui.deleteLater()
    except:
        pass


    myWindow_ui = MyWindow()
    myWindow_ui.show()


    # Development stuff
    try:
        myWindow_ui.show()
    except:
        myWindow_ui.close()
        myWindow_ui.deleteLater()
person Mike Bourbeau    schedule 12.06.2015