当前位置: 代码迷 >> python >> QT Gui窗口出现,然后在Maya中消失
  详细解决方案

QT Gui窗口出现,然后在Maya中消失

热度:45   发布时间:2023-06-13 15:09:42.0

这里有两个问题。 我不了解如何让我的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窗口现在会打开并迅速出现/消失。 我不确定为什么将这段代码放入函数中并调用它会导致更改? 请帮忙,我一直坐在那里,不知道为什么。

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

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