QT Gui Window然后在Maya中消失

时间:2015-10-21 22:20:32

标签: python pyside maya

这里有两个问题。我不知道如何让我的GUI代码作为Maya架子按钮工作,而不是在脚本编辑器中运行。我的第一个问题是,是否有任何简单的方法可以在if --main--部分调用我的代码?现在我不得不把我在那里的几条线放到它自己的功能中并按此方式调用。这就是我所拥有的:

from PySide import QtCore, QtGui, QtUiTools
import maya.cmds as cmds

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)

        GUI STUFF HERE


    def retranslateUi(self, Dialog):
        SET TEXT STUFF

    def closeBtn_clicked(self):
        DO SOMETHING

    def swapRefBtn_clicked(self):
        DO SOMETHING


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(sys.argv)       
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    app.exec_()

我这样做的架子按钮显然不起作用(无论如何要访问if" - main - "?)中的片段:

import swapRef as swap
swap.main()

我找到的唯一解决办法就是把所有这些都投入到它自己的功能中然后只是调用它:

def main():
    import sys
    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(sys.argv)       
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    app.exec_()

但是......当我做出这个改变时,问题#2,我的GUI窗口现在弹出并迅速噗/消失。我不确定为什么将此代码抛入函数并调用它会导致更改?请帮助,我一直坐在这上面,不知道为什么。

1 个答案:

答案 0 :(得分:1)

如果已经有Maya创建的app.exec_()实例,我认为您不需要致电QApplication。我怀疑那个调用可能在这种情况下什么都不做,这就是你的函数返回的原因(这很好,否则会阻塞maya的其余部分)。

因为您没有保存对Dialog变量的引用,因此对话框的问题就会消失,因此在main函数完成时会对其进行垃圾回收。您应该从函数返回Dialog并将其存储在永久性位置以防止垃圾回收。我怀疑做dialog = swap.main()就足够了(不要忘记添加return Dialog行)